7
votes

C ++: Faire un support de projet Unicode

mon projet C ++ est actuellement d'environ 16 000 lignes de code gros et j'admettes d'avoir complètement pensé au support Unicode en premier lieu.

Tout ce que j'ai fait était un typdef personnalisé pour std :: string comme chaîne et saute dans la codage.

Je n'ai jamais vraiment travaillé avec Unicode moi-même dans des programmes que j'ai écrites.

  • Quelle est la dure de changer mon projet à Unicode maintenant? Est-ce même une bonne idée?

  • Puis-je simplement passer à std :: wchar sans aucun problème majeur?


2 commentaires

STD :: Wrchar n'est pas équivalent à Unicode.


@Erik: Maintenant, si seulement Microsoft modifierait leur documentation pour refléter cela ...


3 Réponses :


7
votes

Probablement la partie la plus importante de la création d'une application Unicode consciente consiste à suivre l'encodage de vos chaînes et à vous assurer que vos interfaces publiques sont bien spécifiées et faciles à utiliser avec les codages que vous souhaitez utiliser.

Basculement sur un caractère plus large (en C ++ wchar_t ) n'est pas nécessairement la solution correcte. En fait, je dirais que ce n'est généralement pas la solution la plus simple. Certaines applications peuvent vous éloigner de spécifier que toutes les chaînes et toutes les interfaces utilisent UTF-8 et n'ont pas besoin de changer du tout. std :: string peut parfaitement être utilisé pour les chaînes codées UTF-8.

Toutefois, si vous devez interpréter les caractères d'une chaîne ou d'une interface avec des interfaces non-UTF-8, vous devrez mettre plus de travail mais sans en savoir plus sur votre application, il est impossible de recommander une seule meilleure approche.


0 commentaires

2
votes

Il y a quelques problèmes avec l'utilisation de std :: wstring . Si votre application stockera du texte dans UNICODE, elle s'exécutera sur différentes plates-formes, vous pouvez rencontrer des ennuis. std :: wstring s'appuie sur wchar_t , qui dépend du compilateur. Dans Microsoft Visual C ++, ce type est de largeur de 16 bits et prendra donc uniquement en charge les codages UTF-16. Le compilateur GNU C ++ spécifie ce type à 32 bits de large et prendra donc uniquement en charge les codages UTF-32. Si vous stockez ensuite le texte dans un fichier à partir d'un système (disons Windows / VC ++), puis lisez le fichier à partir d'un autre système (Linux / GCC), vous devrez vous préparer à cette option (dans ce cas convertir de l'UTF-16 à UTF-32).


3 commentaires

"Ce type est de largeur de 16 bits et prendra donc uniquement en charge les codages UTF-16". Ceci est une erreur. Contrairement à la largeur fixe 16 bits Char, UTF-16 fait des points de code de support supérieur à 2 ^ 16.


Je ne parle pas de points de code, je parle du codage des points de code. Je pense que vous êtes confondre UTF-16 avec UCS-2. Sinon, je ne sais pas de quoi vous parlez.


Mon mauvais, j'ai mal compris ce que vous vouliez dire par "seulement soutenir les codages UTF-16".



1
votes

Puis-je simplement passer à [ std :: wchar_t ] sans aucun problème majeur?

Non, ce n'est pas si simple.

  • L'encodage d'un wchar_t est en fonction de la plate-forme. Windows utilise UTF-16. Linux utilise généralement UTF-32. (C ++ 0x atténuera cette différence en introduisant séparément char16_t et char32_t types.)
  • Si vous devez prendre en charge des systèmes de type UNIX, vous n'avez pas toutes les fonctions UTF-16 que Windows a, vous auriez donc besoin d'écrire votre propre _wfopen , etc.
  • Utilisez-vous des bibliothèques tierces? Faire ils support wchar_t ?
  • Bien que des caractères larges soient couramment utilisés pour une représentation en mémoire, sur disque et sur- Les formats-web sont beaucoup plus susceptibles d'être UTF-8 (ou d'autres coding-babased) que UTF-16/32. Vous devriez convertir ces.
  • Vous ne pouvez pas simplement rechercher-et-remplacer char avec wchar_t car c ++ confond "caractère" et "octet", et vous devez déterminer quel Char S sont des caractères et quel Char S sont des octets.

0 commentaires