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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top