Traitement Unicode en C ++


Réponses:


81
  • Utilisez ICU pour traiter vos données (ou une bibliothèque similaire)
  • Dans votre propre magasin de données, assurez-vous que tout est stocké dans le même encodage
  • Assurez-vous que vous utilisez toujours votre bibliothèque Unicode pour des tâches banales telles que la longueur de la chaîne, l'état des majuscules, etc. N'utilisez jamais de bibliothèques standard comme is_alpha moins que ce soit la définition que vous voulez.
  • Je ne peux pas le dire assez: ne parcourez jamais les indices d'un stringsi vous vous souciez de l'exactitude, utilisez toujours votre bibliothèque Unicode pour cela.

Sauf si vous traitez le stringcomme des données binaires.
Demi

10

Si vous ne vous souciez pas de la compatibilité ascendante avec les normes C ++ précédentes, la norme C ++ 11 actuelle a intégré la prise en charge Unicode: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011 /n3242.pdf

La meilleure pratique pour le traitement Unicode en C ++ serait donc d'utiliser les fonctionnalités intégrées pour cela. Ce n'est pas toujours une possibilité avec des bases de code plus anciennes, la norme étant si nouvelle à l'heure actuelle.

EDIT: Pour clarifier, C ++ 11 est compatible Unicode en ce qu'il prend désormais en charge les littéraux Unicode et les chaînes Unicode. Cependant, la bibliothèque standard n'a qu'une prise en charge limitée du traitement et de la conversion Unicode. Pour vos besoins actuels, cela peut suffire. Cependant, si vous devez effectuer une grande quantité de travaux lourds en ce moment, vous devrez peut-être encore utiliser quelque chose comme ICU pour un traitement plus approfondi. Certaines propositions sont actuellement en cours pour inclure un support plus robuste pour la conversion de texte entre différents encodages. Je suppose (et j'espère) que cela fera partie du prochain rapport technique .


Ce lien vers un projet de document standard n'est pas très utile sans une référence à une section particulière qui décrit le "support Unicode intégré" dont vous parlez.
Ben Collins

1
@BenCollins Section 2.14.5 "Littéraux de chaîne" - traite des littéraux de chaîne, y compris des littéraux de chaîne pour les encodages UTF-8, UTF-16 et UTF-32. La section 22.4.1.4 «Codecvt de modèle de classe» - traite de la classe codecvt utilisée pour la conversion entre les codages de caractères (y compris UTF-8, UTF-16 et UTF-32). Il y a plus d'informations sur le support Unicode dans tout le document, mais celles-ci semblent être les sections les plus critiques sur le sujet.
eestrada


5

Voici une liste de contrôle pour la programmation Windows:

  • Toutes les chaînes entre _T ("ma chaîne")
  • fonctions strlen () etc. remplacées par _tcslen () etc.
  • Utilisez LPTSTR et LPCTSTR au lieu de char * et const char *
  • Lorsque vous démarrez de nouveaux projets dans Dev Studio, assurez-vous religieusement que l'option Unicode est sélectionnée dans les propriétés de votre projet.
  • Pour les chaînes C ++, utilisez std :: wstring au lieu de std :: string

11
N'utilisez pas de chaînes, de caractères et de fonctions «T», sauf si vous avez l'intention d'effectuer à la fois des versions Unicode et ANSI. Si vous avez uniquement l'intention de faire des compilations Unicode, faites simplement des trucs de caractères larges réguliers: L "ma chaîne large" wcslen (L "ma chaîne") etc
1800 INFORMATION

D'accord, n'utilisez les macros _T que si vous voulez du texte générique, c'est-à-dire la possibilité de coder à la fois pour Unicode et Ascii / MBCS.

1
Si vous souhaitez utiliser à la fois les chaînes Unicode et ANSI pour C ++, utilisez quelque chose comme typedef std :: basic_string <TCHAR> tString;
Serge du

Ah oui, je fais toujours #ifdef _UNICODE #define tstring std :: wstring #else #define tstring std :: string #endif mais j'aime mieux ta manière Serge.
Adam Pierce

4
Honnêtement, je pense que UTF16 est un gaspillage, laisser tous les encodages en UTF8 est plus simple et bien plus compatible avec * nix.
chacham15

3

Regardez la comparaison de chaînes insensible à la casse en C ++

Cette question a un lien vers la documentation Microsoft sur Unicode: http://msdn.microsoft.com/en-us/library/cc194799.aspx

Si vous regardez sur le côté gauche de la navigation sur MSDN à côté de cet article, vous devriez trouver beaucoup d'informations relatives aux fonctions Unicode. Il fait partie d'un chapitre sur "Encoding Characters" ( http://msdn.microsoft.com/en-us/library/cc194786.aspx )

Il comprend les sous-sections suivantes:

  • Le modèle de page de code
  • Jeux de caractères à deux octets dans Windows
  • Unicode
  • Problèmes de compatibilité dans des environnements mixtes
  • Conversion de données Unicode
  • Migration de programmes Windows vers Unicode
  • Résumé

2

Bien que ce ne soit pas la meilleure pratique pour tout le monde, vous pouvez écrire vos propres routines UNICODE C ++ si vous le souhaitez!

Je viens de finir de le faire pendant un week-end. J'ai beaucoup appris, même si je ne garantis pas que ce soit 100% sans bogue, j'ai fait beaucoup de tests et cela semble fonctionner correctement.

Mon code est sous la nouvelle licence BSD et peut être trouvé ici:

http://code.google.com/p/netwidecc/downloads/list

Il s'appelle WSUCONV et est livré avec un exemple de programme main () qui convertit entre UTF-8, UTF-16 et ASCII standard. Si vous jetez le code principal, vous avez une belle bibliothèque pour lire / écrire UNICODE.


1

Comme cela a été dit ci-dessus, une bibliothèque est le meilleur choix lors de l'utilisation d'un grand système. Cependant, parfois, vous voulez gérer les choses vous-même (peut-être parce que la bibliothèque utiliserait de nombreuses ressources comme sur un micro-contrôleur). Dans ce cas, vous voulez une bibliothèque simple dans laquelle vous pouvez copier les parties pour les choses dont vous avez réellement besoin.

Le code d'exemple de Willow Schlanger semble être un bon (voir sa réponse pour plus de détails).

J'en ai également trouvé un autre qui a un code plus petit, mais qui manque de vérification complète des erreurs et ne gère que UTF-8, mais il était plus simple de retirer des parties.

Voici une liste des bibliothèques intégrées qui semblent décentes.

Bibliothèques intégrées



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.