J'ai fait un peu de lecture autour de la question de l'Unicode, plus précisément, de l'UTF-8 -- (non) support de C++11, et j'espérais que les gourous sur un Débordement de Pile pourrait me rassurer que ma compréhension est correcte, ou un point où j'ai mal compris ou oublié quelque chose, si c'est le cas.
Un court résumé
Tout d'abord, la bonne: vous pouvez définir l'encodage UTF-8, UTF-16 et UCS-4 littéraux dans votre code source. Aussi, l' <locale>
- tête contient plusieurs std::codecvt
des implémentations qui peut convertir entre tous de l'UTF-8, UTF-16, UCS-4 et de la plate-forme multi-octets codage (bien que l'API semble, pour le moins, à moins qu'une simple). Ces codecvt
implémentations peuvent être imbue()
'd sur les cours d'eau pour vous permettre de faire la conversion comme vous le lire ou écrire un fichier (ou un autre cours d'eau).
[EDIT: Cubbi points dans les commentaires que j'ai négligé de mentionner l' <codecvt>
- tête, qui fournit std::codecvt
des implémentations qui ne dépendent pas d'un jeu de paramètres régionaux. Aussi, l' std::wstring_convert
et wbuffer_convert
fonctions peuvent utiliser ces codecvt
s pour convertir des chaînes et des tampons directement, en ne s'appuyant pas sur les cours d'eau.]
C++11 comprend également le C99/C11 - <uchar.h>
d'en-tête qui contient des fonctions pour convertir les caractères individuels à partir de la plate-forme multi-octets codage (qui peut ou peut ne pas être en UTF-8) et de l'UCS-2 et UCS-4.
Cependant, c'est sur la mesure de l'informatique. Alors bien sûr, vous pouvez stocker du texte UTF-8 en std::string
, il n'y a pas moyens que je peux voir à faire quelque chose de vraiment utile. Par exemple, autres que de définir un littéral dans votre code, vous ne pouvez pas valider un tableau d'octets contenant UTF-8 valide, vous ne pouvez pas trouver la longueur (nombre de caractères Unicode, pour une définition de "caractère") de l'UTF-8 contenant de l' std::string
, et vous ne pouvez pas effectuer une itération sur un std::string
de toute autre manière que celle-octet par octet.
De même, le C++11 pour plus d' std::u16string
n'a pas vraiment de support de l'UTF-16, mais seulement les plus âgés de l'UCS-2 -- il n'a pas de support pour les paires de substitution, vous laissant avec seulement le BMP.
Observations
Étant donné que l'UTF-8 est la manière standard de manipuler Unicode sur quasiment toutes les machines Unix dérivé du système (y compris Mac OS X et* Linux) et est devenue le standard de facto sur le web, le manque de soutien en C++ moderne semble être une très grave omission. Même sur Windows, le fait que le nouveau std::u16string
n'a pas vraiment de support de l'UTF-16 semble quelque peu regrettable.
* Comme indiqué dans les commentaires et a clairement ici, la BSD dérivé de Mac OS utiliser l'UTF-8 alors que le Cacao utilise UTF-16.
Questions
Si vous avez réussi à lire tout ça, merci! Juste quelques questions rapides, comme c'est le Débordement de Pile, après tout...
Est l'analyse ci-dessus correcte, ou il y a des autres Unicode installations d'aide je suis absent?
Le comité des normes a fait un travail fantastique dans les deux dernières années, le déplacement de C++ de l'avant à un rythme rapide. Ils sont tous des gens intelligents et je suppose qu'ils sont bien conscients des inconvénients ci-dessus. Est-il une raison connue que support de l'Unicode reste tellement pauvres en C++?
À l'avenir, quelqu'un sait de toute proposition visant à remédier à la situation? Une recherche rapide sur isocpp.org ne semble pas révéler quoi que ce soit.
EDIT: Merci à tous pour vos réponses. Je dois avouer que je trouve un peu décourageant -- on dirait que le statu quo n'est pas susceptible de changer dans un avenir proche. Si il y a un consensus parmi les connaisseurs, il semble que la gestion complète de l'Unicode est tout simplement trop difficile, et que toute solution doit ré-écrire la plupart de l'unité de soins intensifs pour être considéré comme utile.
Personnellement, je ne suis pas d'accord avec cela; je pense qu'il est précieux moyen de trouver un terrain. Par exemple, la validation et la normalisation des algorithmes pour l'UTF-8 et UTF-16 sont bien spécifiées par le consortium Unicode, et pourraient être fournis par la bibliothèque standard libre de fonctions de dans, disons, un std::unicode
d'espace de noms. Ces seuls seraient d'une grande aide pour le C++ programmes qui ont besoin de faire l'interface avec les bibliothèques attend de saisie Unicode. Mais en fonction de la réponse ci-dessous (teinté, il faut le dire, avec une pointe d'amertume), il semble Chiot proposition justement ce type de fonctionnalité limitée n'a pas été bien reçu.