Traitement Unicode en C ++

107

Quelle est la meilleure pratique du traitement Unicode en C ++?

Fortepianissimo
la source

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.
hazzen
la source
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 .

eestrada
la source
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
9

Notre société (et d'autres) utilisent la bibliothèque open source Internation Components for Unicode (ICU) développée à l'origine par Taligent.

Il gère les chaînes, les paramètres régionaux, les conversions, les dates / heures, le classement, les transformations, etc. Al.

Commencez avec le guide d'utilisation ICU

jschroedl
la source
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
Adam Pierce
la source
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é
ine
la source
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.

Willow Schlanger
la source
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

Paul Hutchinson
la source