2010-07-07 6 views
2

Je passe actuellement un peu de temps à convertir mon unité réseau pour supporter les chaînes Unicode et tout va bien jusqu'à présent (du moins je le pense). Malheureusement, je travaille sur Delphi 7 donc je ne peux pas tester le support Unicode en action et je n'ai pas de documentation sur les nouvelles versions de Delphi.Est-ce que TReader/TWriter prend en charge unicode?

J'ai utilisé quelques objets TReader et TWriter dans mon code pour diffuser des chaînes avec les méthodes ReadString et WriteString. Sur D7, ils utilisent le type String qui est égal à AnsiString là. Si j'ai bien compris, dans D2009/D2010, le type de chaîne est égal à UnicodeString. Est-ce que quelqu'un sait si TReader et TWriter automatiquement flux des chaînes au format UnicodeString lors de l'utilisation des méthodes ReadString et WriteString dans D2009/D2010 ou dois-je changer quelque chose?

+1

Documentation pour les versions plus récentes: [TReader] (http://docwiki.embarcadero.com/VCL/fr/Classes.TReader), [TWriter ] (http://docwiki.embarcadero.com/VCL/en/Classes.TWriter). –

Répondre

4

Oui. TReader et TWriter supportent Unicde. En fait, il n'y a qu'une partie de vcl/rtl qui ne supporte pas Unicode: les anciennes méthodes d'accès au fichier Read (Ln) et Write (Ln) qui sont aussi utilisées pour lire et écrire directement depuis et vers une console.

Oui, chaîne est UnicodeString dans D2009 +. Et PChar est PWideChar en D2009 +. Donc, si vous respectez les types standards, votre code sera très bien.

Vous aurez seulement des ennuis lorsque vous baserez le code en supposant qu'un caractère est égal à un octet.

Mise à jour:

+1

Si vous respectez les types standard et avez déjà écrit un code qui attend Unicode même si elle ne le rencontrera jamais ... alors votre code sera très bien. Si vous avez écrit du code en supposant et en espérant ASCII et en évitant ANSI, alors votre code se connectera correctement, mais il ne prendra pas correctement en charge Unicode. Le problème est que vous l'avez peut-être fait involontairement. Si vous utilisez UpperCase(), vous ne prenez pas en charge Unicode. Pour prendre en charge Unicode correctement, vous devez utiliser ANSIUpperCase(). Pour donner juste un exemple bizarre et potentiellement confus. – Deltics

+0

Ah oui, bon point. Les méthodes Ansi * nommées de manière confuse –

2

Je viens de regarder mon Delphi 2010 installer, et TWriter a les méthodes suivantes:

procedure WriteStr(const Value: AnsiString); 
procedure WriteUTF8Str(const Value: string); 
procedure WriteString(const Value: UnicodeString); 
procedure WriteWideString(const Value: UnicodeString); 

TReader a des méthodes équivalentes. Donc WriteStr (et ReadStr) fonctionnera avec AnsiStrings pour la rétrocompatibilité, WriteString et WriteWideString écriront une chaîne unicode comme unicode, et WriteUTF8Str accepte une chaîne unicode et l'écrit comme UTF8. (Ce qui économise beaucoup d'espace si vous utilisez le jeu de caractères ANSI.)

Questions connexes