Sì, lo hai capito correttamente. Questo è il VCL e la sua documentazione che sono guasti. La tua confusione ha perfettamente senso!
Nel Delphi 2009+ implementazione, è necessario utilizzare AsString
immobili per AnsiString
e AsWideString
per string=UnicodeString
.
Infatti, le As*String
proprietà sono definite come tali:
property AsString: string read GetAsString write SetAsString;
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;
Come diavolo possiamo essere in grado di scoprire che AsString
restituisce un AnsiString
? Semplicemente non ha alcun senso, se confrontato con il resto della VCL/RTL.
L'implementazione, che utilizza la classe TStringField
per AnsiString
e TWideStringField
per string=UnicodeString
è danneggiata.
Inoltre, il documentation is also broken:
Data.DB.TField.AsString
Rappresenta il valore del campo come stringa (Delphi) o un AnsiString (C++).
Questo non rappresenta una string
in Delphi, ma un AnsiString
! Il fatto che la proprietà usi un semplice tipo string=UnicodeString
è assolutamente fuorilegge.
Dal punto di vista del database, spetta al driver DB gestire Unicode o lavorare con un set di caratteri specifico. Ma dal punto di vista della VCL, in Delphi 2009+ dovresti conoscere solo il tipo string
e confidare che l'utilizzo di AsString: String
sarà pronto per Unicode.
fonte
2013-04-22 05:32:13
+1 Dal momento che questo comportamento è IMHO un'implementazione errata VCL. È IMHO una denominazione errata, * incoerente con il resto VCL/RTL * e una fonte di molta confusione/incomprensione. La tua domanda ha perfettamente senso. –