Delphi Xe2 Dataset Field Type TStringField ne prend pas en charge Unicode?
-
13-11-2019 - |
Question
J'ai parcouru la classe TDATASET et ses champs de chaînes, dans Delphi Xe2 et j'ai remarqué qu'Aswidestring renvoie un type d'unicodestring. Cependant, il obtient la valeur de la fonction tfield.assstring: String qui à son tour appelle tfield.asansistring: ANSistring. Par conséquent, des caractères Unicode seraient perdus? Le tampon qui est transmis à tdataset.getfieldData est déclaré comme un tableau d'Ansichar.
Suis-je en train de comprendre cela correctement?
La solution
Non, vous devriez examiner le Twidestringfield classe qui est pour les champs Unicode et le Tstringfield classe qui est pour les chaînes non Unicodes. Tiel est juste une classe de base et Tfield.getaswidestring est une méthode virtuelle avec une implémentation de rabais qui est remplacée par des descendants qui sont conscients de l'Unicode.
Autres conseils
Oui, vous l'avez bien compris. C'est le VCL et sa documentation qui sont cassés. Votre confusion a parfaitement un sens!
Dans l'implémentation de Delphi 2009+, vous devez utiliser AsString
propriété pour AnsiString
et AsWideString
pour string=UnicodeString
.
En fait, le As*String
Les propriétés sont définies comme telles:
property AsString: string read GetAsString write SetAsString;
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString;
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString;
Comment diable pouvons-nous être en mesure de découvrir que AsString
retourne un AnsiString
? Cela n'a tout simplement pas de sens, par rapport au reste du VCL / RTL.
L'implémentation, qui utilise TStringField
classe pour AnsiString
et TWideStringField
pour string=UnicodeString
est cassé.
De plus, le La documentation est également rompue:
Data.db.tfield.assstring
Représente la valeur du champ en tant que chaîne (Delphi) ou ANSistring (C ++).
Cela ne représente pas un string
à Delphi, mais un AnsiString
! Le fait que la propriété utilise une plaine string=UnicodeString
Le type est parfaitement défaut.
Sur le point de vue de la base de données, il appartient au pilote DB de gérer Unicode ou de travailler avec un charse spécifique. Mais du point de vue VCL, dans Delphi 2009+, vous ne devriez connaître que string
taper et être convaincu que l'utilisation AsString: String
sera prêt pour Unicode.