Delphi XE - dois-je utiliser String ou AnsiString?
J'ai enfin mis à jour à Delphi XE. J'ai une bibliothèque d'unités où j'utilise les cordes pour stocker la plaine de caractères ANSI (caractères entre A et U). Je suis à 101% sûr que je vais jamais, jamais, jamais utiliser des caractères UNICODE dans ces lieux.
Je veux convertir toutes les autres bibliothèques de l'Unicode, mais pour cette bibliothèque spécifique, je pense qu'il sera préférable de s'en tenir à la norme ANSI. L'avantage, c'est l'exigence de mémoire que dans certains cas, je me charge de très gros fichiers TXT (contenant UNIQUEMENT des caractères Ansi). L'inconvénient peut-être que j'ai à faire beaucoup, beaucoup de typecasts quand je fais ces bibliothèques à interagir avec la normale (unicode) des bibliothèques.
Il y a quelques lignes directrices générales pour montrer quand est bon de les convertir au format Unicode et quand le bâton avec Ansi?
source d'informationauteur Rigel
Vous devez vous connecter pour publier un commentaire.
Le problème avec les lignes directrices générales, c'est que quelque chose comme cela peut être très spécifiques à la situation de la personne. Votre exemple est l'un de ceux.
Toutefois, pour les personnes Googler et en arrivant ici, quelques recommandations générales sont les suivantes:
Oui, convertir au format Unicode. N'essayez pas de garder une vieille application entièrement à l'aide de
AnsiString
s. La raison en est que l'ensemble de la VCL est en Unicode, et vous ne devriez pas essayer de mélanger les deux, parce que vous allez convertir à chaque fois que vous affectez une chaîne Unicode en une chaîne ANSI, et c'est une perte de conversion. En essayant de garder à l'ancienne parce que c'est moins de travail (ou autre raison) va vous causer de la douleur; il suffit d'embrasser la nouvellestring
type, convertir, et aller avec elle.Plutôt que de façon aléatoire en mélangeant les deux, explicitement effectuer toutes les conversions, vous devez, une fois - par exemple, si vous êtes en train de charger des données à partir d'une ancienne version de votre programme, vous savez, il sera ANSI, lisez-donc dans une chaîne Unicode là, et c'est tout. Jamais après, il sera Unicode.
Vous ne devez pas modifier le type de votre
string
variables -string
pré-D2009 est en ANSI, et dans D2009 et de modifier Unicode. Au lieu de cela, suivez les avertissements du compilateur et de regarder la corde sur laquelle les méthodes que vous utilisez - certains encore prendre unAnsiString
paramètre et je trouve tout à confusion. Le compilateur va vous le dire.Si vous utilisez des chaînes de tenir octets (en d'autres mots, en les utilisant comme un tableau d'octets parce qu'un personnage a été un octet) de l'interrupteur à
To
.Vous pouvez rencontrer des problèmes spécifiques pour des choses comme le cryptage (chaînes de caractères ne sont plus octet/caractères, de sorte que le "caractère" pour "caractère", vous pouvez obtenir différents output); lecture de fichiers texte (utilisez les classes de flux et TEncoding); et, franchement, divers trucs. Rechercher ici, la plupart des choses ont déjà été posées.
Commentateurs, s'il vous plaît ajouter plus de suggestions... j'ai surtout l'utilisation de C++Builder, pas de Delphes, et il ya probablement assez quelques choses pour Delphi je ne sais pas.
Maintenant pour votre question: devez-vous convertir cette bibliothèque?
Si:
alors pas la conversion en Unicode, et, au lieu de passer votre
string
s àAnsiString
s, a du sens.Être conscient que:
UTF8String
qui est un type spécifique deAnsiString
qui ne sera pas de perte de qualité lors de la conversion, et toujours conserver la plupart de texte (en caractères Romains) dans un seul octetstring
àAnsiString
peut-être un peu de travail, et vous aurez besoin de vérifier toutes les méthodes appelées avec eux pour voir si de trop nombreuses conversions implicites sont en cours (pour la performance), etcif 'S' in MySet
?) ne fonctionne pas. À partir de votre description des caractères de A à U, je pouvais deviner que vous souhaitez utiliser cette syntaxe.Ma recommandation? Personnellement, la seule raison pour laquelle je voudrais faire à partir de l'information que vous avez donnée est l'utilisation de la mémoire, et éventuellement de la performance en fonction de ce que vous faites avec cette énorme quantité de
A..U
s. Si c'est vraiment important, c'est à la fois le pilote et la contrainte, et vous devez les convertir au format ANSI.Vous devriez être en mesure d'envelopper jusqu'à la conversion à l'interface entre cet appareil et de ses clients. Utilisation AnsiString en interne et de la chaîne de partout ailleurs et vous devriez être bien.
En règle générale, l'utilisation AnsiString s'il est important que les Caractères sont les octets, Sinon l'utilisation de la chaîne assure la compatibilité future avec Unicode.
Vous devez vérifier toutes les bibliothèques de toute façon parce que toutes les fonctions de l'API Windows dans Delhpi XE remplacés par leurs unicode analogues, etc. Si vous ne serez jamais utiliser UNICODE, vous devez utiliser Delphi 7.
Utilisation AnsiString explicitement partout dans cette unité, puis vous obtiendrez d'avertissement du compilateur erreurs (que vous ne devriez jamais ignorer) pour la Chaîne AnsiString des erreurs de conversion si vous arrivez à accéder aux routines de manière incorrecte.
Alternativement, peut-être, de préférence, en fonction de votre situation, il suffit de tout convertir en UTF8.
Bâton avec des chaînes Ansi que si vous n'avez pas le temps de convertir le code correctement. L'utilisation de chaînes Ansi est vraiment uniquement pour la compatibilité descendante - à ma connaissance de C# n'a pas de equiavalent à des chaînes Ansi. Sinon l'utilisation de la norme Unicode. Si vous avez un coup d'oeil sur mon site web j'ai un ensemble de chaînes de routines de l'unité (environ 5 000 LOC) qui fonctionne avec Delphi 2007 (non-Uniocde) et XE (Unicode), avec seulement une "chaîne" interfaces et contient presque tous les problèmes de conversion, vous pourriez faire face.