Question

Nous avons développé un ensemble d'applications pour le jeu de caractères ASCII. Maintenant, nous essayons de l'installer en Islande et nous rencontrons des problèmes au sujet desquels les caractères islandais se font avoir.

Nous travaillons sur nos problèmes, mais je me demandais: existe-t-il un bon "guide"? existe-t-il pour écrire du code C ++ conçu pour les caractères 8 bits et qui fonctionnera correctement lorsque les données UTF-8 lui sont fournies?

Je ne peux pas m'attendre à ce que tout le monde lise l'intégralité de la norme Unicode, mais si quelque chose de plus digeste est disponible, j'aimerais le partager avec l'équipe afin que nous ne rencontrions plus ces problèmes.

Il est actuellement impossible de réécrire toutes les applications pour qu'elles utilisent wchar_t ou une autre représentation de chaîne. Je noterai également que ces applications communiquent sur des réseaux avec des serveurs et des périphériques utilisant des caractères 8 bits. Par conséquent, même si nous utilisions Unicode en interne, nous aurions toujours des problèmes de traduction aux limites. Pour la plupart, ces applications ne font que transmettre des données; ils ne "traitent" pas le texte d'une autre manière que de le copier d'un endroit à l'autre.

Les systèmes d'exploitation utilisés sont Windows et Linux. Nous utilisons les chaînes std :: string et C plain-old. (Et ne me demandez pas de défendre les décisions de conception. J'essaie simplement d'aider à réparer les dégâts.)

Voici une liste de ce qui a été suggéré:

Était-ce utile?

La solution

Cela ressemble à un guide rapide complet:
http://www.cl.cam.ac.uk/~mgk25/ unicode.html

Autres conseils

Soyez simplement propre, pour l’essentiel. Cependant, vous devez être conscient du fait que tout caractère non-ASCII se divise en plusieurs octets. Vous devez donc en tenir compte si vous coupez la ligne ou tronquez le texte à afficher.

UTF-8 présente l’avantage de pouvoir toujours indiquer où vous vous trouvez dans un caractère multi-octets: si le bit 7 est défini et le bit 6 réinitialisé (l’octet est 0x80-0xBF), il s’agit d’un octet de fin, tandis que si le bit 7 et 6 sont définis et 5 est réinitialisé (0xC0-0xDF), il s’agit d’un octet principal avec un octet de fin; si 7, 6 et 5 sont définis et que 4 est réinitialisé (0xE0-0xEF), il s'agit d'un octet de tête avec deux octets de fin, etc. Le nombre de bits consécutifs mis au bit le plus significatif est le nombre total d'octets constituant le caractère. C'est-à-dire:

110x xxxx = caractère sur deux octets
1110 xxxx = caractère sur trois octets
1111 0xxx = caractère sur quatre octets
etc

L’alphabet islandais est entièrement contenu dans l’ISO 8859-1 et donc dans Windows-1252. S'il s'agit d'une application en mode console, sachez que la console utilise des pages de codes IBM. Par conséquent, elle peut s'afficher (selon les paramètres régionaux du système) au format 437, 850 ou 861 . Windows ne prend pas en charge l'affichage natif pour UTF-8; vous devez passer au format UTF-16 et utiliser les API Unicode.

L'appel de SetConsoleCP et de SetConsoleOutputCP, en spécifiant la page de codes 1252, vous aidera à résoudre votre problème, s'il s'agit d'une application en mode console. Malheureusement, la police de la console sélectionnée doit être une police prenant en charge la page de codes et je ne vois pas comment définir cette police. Les polices bitmap standard ne prennent en charge que la page de codes OEM par défaut du système.

Sachez que l’unicode complet ne tient pas dans les caractères 16 bits; utilisez donc des caractères 32 bits ou un codage à largeur variable (UTF-8 est le plus répandu).

UTF-8 a été conçu précisément pour répondre à vos problèmes. Une chose à laquelle je ferais attention est qu'ASCII est vraiment un codage 7 bits, donc si une partie de votre infrastructure utilise le 8e bit à d'autres fins, cela peut être délicat.

Vous pouvez consulter icu . Ils pourraient avoir des fonctions disponibles qui faciliteraient le travail avec les chaînes UTF-8.

L’Islandais utilise ISO Latin 1, huit bits devraient donc suffire. Nous avons besoin de plus de détails pour comprendre ce qui se passe.

L’islandais, comme le français, l’allemand et la plupart des langues d’Europe occidentale, peut être pris en charge avec un jeu de caractères 8 bits (CP1252 sous Windows, ISO 8859-1, également appelé Latin1 sous * x). C'était l'approche standard avant l'invention de l'Unicode, et elle est encore assez courante. Lorsque vous dites que vous avez une contrainte, vous ne pouvez pas réécrire votre application pour utiliser wchar, et vous n'avez pas besoin de le faire.

Vous ne devriez pas être surpris que UTF-8 pose des problèmes; UTF-8 code les caractères non-ASCII (par exemple, les caractères latins accentués, thorn, eth, etc.) sous la forme DEUX octets chacun.

Le seul conseil général qui puisse être donné est assez simple (en théorie): (1) décidez quel jeu de caractères vous allez supporter (Unicode, Latin1, CP1252, ...) dans votre système (2) Si des données encodées d’une autre manière (par exemple, UTF-8) vous sont fournies, convertissez-les ensuite au format standard (par exemple, CP1252) à la frontière du système. (3) si vous devez fournir des données codées d’une autre manière, ...

Vous pouvez utiliser des caractères larges (wchar_t au lieu de char et std :: wstring au lieu de std :: string). Cela ne résout pas automatiquement 100% de vos problèmes, mais constitue une bonne première étape.

Utilisez également des fonctions de chaîne compatibles avec Unicode (reportez-vous à la documentation). Si quelque chose manipule des caractères larges ou une chaîne, il est généralement conscient de leur caractère large.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top