Comment bien le C++ standard library support de l'unicode?
Terriblement.
Une analyse rapide à travers les installations de la bibliothèque qui pourrait fournir le support de l'Unicode me donne cette liste:
- Les chaînes de la bibliothèque
- La localisation de la bibliothèque
- D'entrée/sortie de la bibliothèque
- Les expressions régulières de la bibliothèque
Je pense que tous, mais le premier de fournir terrible de soutien. Je vais y revenir plus en détail après un rapide détour par le biais de vos autres questions.
N' std::string
ce qu'il devrait?
Oui. Selon la norme C++, c'est ce qu' std::string
et de ses frères et sœurs devraient faire:
Le modèle de classe basic_string
décrit des objets qui peuvent stocker une séquence composée d'un nombre variable de l'arbitraire char comme des objets avec le premier élément de la séquence à la position zéro.
Eh bien, std::string
le fait très bien. Le fait de fournir Unicode fonctionnalités spécifiques? Pas de.
Devrait-il? Probablement pas. std::string
est fine comme une séquence de char
objets. C'est utile; le seul ennui, c'est que c'est un très faible niveau de l'affichage de texte et de la norme C++ n'est pas de fournir un niveau supérieur.
Comment puis-je l'utiliser?
L'utiliser comme une séquence de char
objets; prétendant que c'est quelque chose d'autre est lié à la fin dans la douleur.
Où sont les problèmes potentiels?
Tous sur la place? Voyons voir...
Les chaînes de la bibliothèque
Les chaînes de la bibliothèque nous fournit basic_string
, qui est simplement une séquence de ce que la norme appelle "char comme des objets". Je les appelle des unités de code. Si vous voulez une vue de haut niveau du texte, ce n'est pas ce que vous cherchez. Ceci est une vue de texte approprié pour la sérialisation/désérialisation/de stockage.
Il fournit également des outils de la bibliothèque C qui peuvent être utilisés pour combler le fossé entre l'étroitesse du monde et de l'Unicode monde: c16rtomb
/mbrtoc16
et c32rtomb
/mbrtoc32
.
La localisation de la bibliothèque
La localisation de la bibliothèque croit encore que l'un de ces "char comme des objets" équivaut à un "caractère". C'est bien sûr ridicule, et il est impossible d'obtenir beaucoup de choses à travailler correctement au-delà d'un petit sous-ensemble de l'Unicode en ASCII par exemple.
Considérons, par exemple, ce que la norme appelle "la commodité des interfaces" dans l' <locale>
- tête:
template <class charT> bool isspace (charT c, const locale& loc);
template <class charT> bool isprint (charT c, const locale& loc);
template <class charT> bool iscntrl (charT c, const locale& loc);
// ...
template <class charT> charT toupper(charT c, const locale& loc);
template <class charT> charT tolower(charT c, const locale& loc);
// ...
Comment voulez-vous que l'une de ces fonctions pour bien classer, disons, U+1F34C ʙᴀɴᴀɴᴀ, en u8"