Delphi XE2 SetSet Field Type Tstringfield non supporta Unicode?
-
13-11-2019 - |
Domanda
Ho esaminato la classe Tdataset e i suoi campi di stringa, a Delphi XE2 e ho notato che Aswidestring restituisce un tipo di unicodestring. Tuttavia ottiene il valore dalla funzione tfield.asstring: stringa che a sua volta chiama tfield.asansistring: Ansistring. Pertanto i caratteri Unicode andrebbero persi? Anche il buffer che viene passato a tdataset.getfielddata è dichiarato come una matrice di Ansichar.
Lo capisco correttamente?
Soluzione
No, dovresti esaminare il Twidestringfield classe che è per i campi Unicode e il Tstringfield Classe che è per stringhe non unicode. Tfield è solo una lezione di base e Tfield.getaswidestring è un metodo virtuale con un'implementazione di caduta che viene annullata dai discendenti che sono a conoscenza di Unicode.
Altri suggerimenti
Sì, l'hai capito correttamente. Questo è il VCL e la sua documentazione che sono rotti. La tua confusione ha perfettamente senso!
Nell'implementazione di Delphi 2009+, devi usare AsString
Proprietà per AnsiString
e AsWideString
per string=UnicodeString
.
In effetti, il As*String
Le 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 scoprirlo AsString
Restituisce un AnsiString
? Semplicemente non ha senso, rispetto al resto del VCL/RTL.
L'implementazione, che utilizza TStringField
classe per AnsiString
e TWideStringField
per string=UnicodeString
è rotta.
Inoltre, il Anche la documentazione è rotta:
Data.db.tfield.asstring
Rappresenta il valore del campo come stringa (Delphi) o Ansistring (C ++).
Questo non rappresenta un file string
a Delphi, ma un AnsiString
! Il fatto che la proprietà usi una pianura string=UnicodeString
Il tipo è perfettamente mancante.
Sul punto di vista del database, spetta al driver DB gestire Unicode o lavorare con un chatset specifico. Ma dal punto di vista VCL, a Delphi 2009+ dovresti solo sapere string
digitare e essere sicuro che usi AsString: String
sarà pronto per gli Unicode.