Chaînes C ++: codage UTF-8 ou 16 bits?
Je suis encore à essayer de décider si mon (maison) projet doit utiliser UTF-8 cordes (mis en œuvre en termes de std::string avec d'autres UTF-8 fonctions spécifiques lorsque cela est nécessaire) ou de certains de 16 bits de la chaîne (mis en œuvre comme std::wstring). Le projet est un langage de programmation et environnement (comme VB, c'est une combinaison des deux).
Il y a quelques souhaits/contraintes:
- Ce serait cool si il pouvait courir sur une quantité limitée de matériel, tels que les ordinateurs disposant de peu de mémoire.
- Je veux le code à exécuter sur Windows, Mac et (si les ressources le permettent) de Linux.
- Je vais être en utilisant wxWidgets que mon GUI couche, mais je veux le code qui interagit avec ce toolkit confiné dans un coin de la base de code (j'aurais sans interface graphique, les exécutables).
- Je voudrais éviter de travailler avec deux différents types de chaînes lorsque vous travaillez avec de l'utilisateur-texte visible et avec les données de l'application.
Actuellement, je travaille avec des std::string, avec l'intention d'utiliser l'UTF-8 fonctions de manipulation de seulement lorsque nécessaire. Il nécessite moins de mémoire, et semble être le sens de nombreuses applications vont de toute façon.
Si vous recommander un 16-bits, que l'on: UTF-16? UCS-2? D'un autre??
source d'informationauteur Carl Seleborg
Vous devez vous connecter pour publier un commentaire.
Je recommanderais UTF-16 pour tout type de manipulation de données et l'INTERFACE utilisateur.
Le Mac OS X et Win32 API utilise l'UTF-16, même pour wxWidgets, Qt, soins intensifs, Xerces, et d'autres.
UTF-8 peut-être mieux pour l'échange de données et de stockage.
Voir http://unicode.org/notes/tn12/.
Mais quoi que vous choisissiez, je recommanderais certainement à l'encontre de std::string avec UTF-8 "seulement si nécessaire".
Aller tout le chemin avec UTF-16 ou UTF-8, mais ne pas mélanger et assortir, c'est d'avoir des ennuis.
UTF-16 est encore une longueur variable de codage de caractères (il y a plus de 2^16 unicode codepoints), de sorte que vous ne pouvez pas le faire O(1) de la chaîne des opérations d'indexation. Si vous êtes en train de faire beaucoup de ce genre de chose, vous n'êtes pas de sauver quoi que ce soit dans la vitesse sur UTF-8. D'autre part, si votre texte contient beaucoup de codepoints dans le 256-65535 gamme, UTF-16 peut être une amélioration substantielle de la taille. UCS-2 est une variante de l'UTF-16 qui est de longueur fixe, au coût d'interdire toute codepoints supérieur à 2^16.
Sans en savoir plus sur vos besoins, je serais personnellement aller pour de l'UTF-8. C'est le plus simple à gérer pour toutes les raisons que d'autres se sont déjà inscrits.
Je n'ai jamais trouvé de raisons d'utiliser autre chose que de l'UTF-8 pour être honnête.
Si vous décidez d'aller avec l'encodage UTF-8, découvrez cette bibliothèque: http://utfcpp.sourceforge.net/
Il peut rendre votre vie beaucoup plus facile.
En fait, j'ai écrit un largement utilisé l'application (5million+ utilisateurs) de sorte que chaque kilo-octet ajoute, littéralement. Malgré cela, j'ai juste collé à wxString. Je l'ai configuré pour être dérivée à partir de std::wstring, afin que je puisse les transmettre à des fonctions attend à une wstring const&.
Veuillez noter que std::wstring est natif de l'Unicode sur le Mac (pas de l'UTF-16 nécessaires pour les caractères au-dessus de U+10000), et par conséquent, il utilise 4 octets/wchar_t. Le gros avantage, c'est que j'++ vous obtient le caractère suivant, toujours. Sur Win32, c'est vrai que dans 99,9% des cas. Comme un compagnon de programmeur, vous allez comprendre comment peu à 99,9%.
Mais si vous n'êtes pas convaincu, écrire la fonction majuscule std::string[UTF-8] et un std::wstring. Ces 2 fonctions dites-vous de quelle manière est de la folie.
Votre format de disque est une autre affaire. Pour la portabilité, qui doit être en UTF-8. Il n'y a pas endianness préoccupation en UTF-8, ni une discussion sur la largeur (2/4). Cela peut être la raison pour laquelle de nombreux programmes semblent utiliser l'UTF-8.
Un peu sans rapport avec la note, veuillez lire sur chaîne Unicode comparisions et de normalisation. Ou vous finirez avec le même bug que .NET, où vous pouvez avoir deux variables föö et föö ne différant que par la (invisible) la normalisation.
MicroATX est à peu près un PC standard de la carte mère format, les plus capables de 4 à 8 GO de RAM. Si vous parlez picoATX peut-être que vous êtes limité à 1 ou 2 GO de RAM. Même alors, c'est beaucoup pour un environnement de développement. J'avais toujours s'en tenir avec l'encodage UTF-8 pour les raisons mentionnées ci-dessus, mais la mémoire ne devrait pas être votre préoccupation.
De ce que j'ai lu, il est préférable d'utiliser une 16-bits en interne, sauf si vous êtes à court de mémoire. Il s'adapte à presque toutes les langues vivantes dans l'un caractère
Je voudrais aussi regarder Soins intensifs. Si vous n'allez pas être en utilisant certains STL fonctions de chaînes de caractères, à l'aide de l'unité de soins intensifs de la chaîne types d'pourrait être mieux pour vous.
Avez-vous envisagé d'utiliser wxStrings? Si je me souviens bien, ils peuvent le faire en utf-8 <-> conversions Unicode et il sera un peu plus facile quand vous avez à passer des chaînes vers et à partir de l'INTERFACE utilisateur.