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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top