web-dev-qa-db-fra.com

La bonne façon de gérer Unicode avec C ++ en 2018?

J'ai essayé de chercher stackoverflow pour trouver une réponse à cela, mais les questions et réponses que j'ai trouvées datent d'environ 10 ans et je n'arrive pas à trouver un consensus sur le sujet en raison des changements et des progrès possibles.

Il y a plusieurs bibliothèques que je connais en dehors de la stl qui sont censées gérer unicode-

Il y a quelques fonctionnalités de la stl ( wstring , codecvt_utf8 ) qui ont été incluses mais les gens semblent être ambivalents à propos de leur utilisation car ils traitent avec UTF-16 que ce site: ( tf-8 partout ) dit que ne devrait pas être utilisé et beaucoup de gens en ligne semblent d'accord avec la prémisse.

La seule chose que je recherche, c'est la possibilité de faire 4 choses avec une chaîne unicode-

  1. Lire une chaîne en mémoire
  2. Recherchez la chaîne avec regex en utilisant unicode ou ascii, concaténez ou effectuez un remplacement/formatage de texte avec elle avec des nombres ou des caractères ascii + unicode.
  3. Convertissez en ascii + le format numérique unicode pour les caractères qui ne rentrent pas dans la plage ascii.
  4. Écrivez une chaîne sur le disque ou envoyez-la n'importe où.

D'après ce que je peux dire, icu gère cela et plus encore. Ce que j'aimerais savoir, c'est s'il existe un moyen standard de gérer cela sous Linux, Windows et MacOS.

Merci pour votre temps.

27
Lfod

Je vais essayer de jeter quelques idées ici:

  • la plupart des programmes/programmeurs C++ supposent simplement qu'un texte est une séquence d'octets presque opaque. UTF-8 est probablement coupable de cela, et il n'est pas surprenant que de nombreux commentaires reprennent: ne vous inquiétez pas avec Unicode, traitez simplement les chaînes encodées UTF-8
  • les fichiers ne contiennent que des octets. À un moment, si vous essayez de traiter en interne de vrais points de code Unicode, vous devrez sérialiser cela en octets -> ici encore UTF-8 gagne le point
  • dès que vous sortez du plan multilingue de base (points de code 16 bits), les choses deviennent de plus en plus complexes. Le emoji est particulièrement horrible à traiter: un emoji peut être suivi d'un sélecteur de variation (U + FE0E VARIATION SELECTOR-15 (VS15) pour le texte ou U + FE0F VARIATION SELECTOR-16 (VS16) pour le style emoji) pour modifier son style d'affichage, plus ou moins l'ancien i bs ^ qui a été utilisé en 1970 ascii quand on voulait imprimer î. Ce n'est pas tout, les caractères U + 1F3FB à U + 1F3FF sont utilisés pour fournir une couleur de peau à 102 emoji humains répartis sur six blocs: Symboles, Émoticônes, Symboles divers, Symboles et pictogrammes divers, Symboles et pictogrammes supplémentaires, et Transport et carte Symboles.

    Cela signifie simplement que jusqu'à 3 points de code Unicode consécutifs peuvent représenter un seul glyphe ... Donc, l'idée qu'un caractère est un char32_t est toujours une approximation

Ma conclusion est que Unicode est une chose complexe, et nécessite vraiment une bibliothèque dédiée comme ICU. Vous pouvez essayer d'utiliser des outils simples comme les convertisseurs de la bibliothèque standard lorsque vous ne traitez qu'avec le BMP, mais la prise en charge complète va bien au-delà.


BTW: même d'autres langages comme Python qui prétendent avoir un support natif unicode (qui est bien mieux à mon humble avis que le C++ actuel) échouent sur une partie:

  • la bibliothèque GUI tkinter ne peut afficher aucun point de code en dehors de BMP - alors qu'il s'agit de l'outil IDLE standard Python outil
  • différents modules ou la bibliothèque standard sont dédiés à Unicode en plus du support du langage de base (codecs et unicodedata), et d'autres modules sont disponibles dans le Python Package Index comme le support emoji parce que la bibliothèque standard ne répond pas à tous les besoins

Donc, le support pour Unicode est médiocre depuis plus de 10 ans, et je n'espère pas vraiment que les choses iront beaucoup mieux dans les 10 prochaines années ...

12
Serge Ballesta