basic_string vs. codage des caractères
Citation:
Envoyé par
wistiti1234
Donc le wstring que j'utilise ne gérerait pas totalement l'utf-8.
C'est une litote. wstring ne gère pas du tout l'UTF-8, pas du tout l'UTF-16, pas du tout l'UTF-32 etc.
Rappel :
wstring = basic_string<wchar_t>
string = basic_string<char>
basic_string<T> stocke des T. Il gère la mémoire, peut être initialisé par une suite de T terminée par un zéro...
C'est tout. basic_string ignore tout du codage des caractères, et n'interprète rien.
Tu peux utiliser string pour du iso-8859-*, pour de l'UTF-8, de l'UTF-16(LE|BE)...
Sous linux, sizeof(wchar_t) = 4, et wstring est normalement de l'UCS-4. (Sous Windows, sizeof(wchar_t) = 2, wstring est généralement en UTF-16.)
Dans tous les cas, une *string contient ce que tu as mis. Il faut savoir ce qu'on y met pour savoir quelles opérations ont un sens : quand tu écris :
puisque ton source est en UTF-8 et que le compilateur ne fait aucune conversion (ce qui me surprend), s contient de l'UTF-8, donc l'opérateur d'indexation (operator[]) renvoie un octet qui n'a pas (toujours) de sens hors contexte (qui ne correspond pas à un "code-point", ou à un caractère). Donc tu ne peux ni utiliser les fonctions de classification isxxx, ni imprimer cette valeur toute seule avec cout.
De plus, 'é' n'a pas le type char, mais int, parce que c'est un littéral multi-caractères et pas un littéral caractère, comme tu as vu.
Si tu utilisais un codage mono-caractère comme iso-8859-*, tu pourrais indexer ta chaine et utiliser les fonctions isxxx et to(lower|upper).
Dans l'affaire, string est complètement neutre.
La norme ne spécifie aucun codage de caractère particulier, ni pour char, ni pour wchar_t. (Même le codage en ASCII des caractères qui sont ASCII n'est pas obligatoire.) D'ailleurs il est utile d'avoir le choix du codage de char. (La multiplicité des codages de wchar_t est un artéfact historique, ça devrait toujours être UCS-*.)
Les entrée-sorties en C++ sont définies comme mono-char : la norme considère que le système traite les E/S de cette façon. std::cout sort directement (sans conversion) ce qui lui est envoyé (c'est pour ça que le dump "inversé" m'a grandement perturbé!).
Les E/S en wchar_t dont définies par conversion de wchar_t en char, la conversion effectuée dépendant du codage, qui comme je l'ai dis, dépend de l'implémentation (et de la locale).
Ici, la locale étant UTF-8, wcout devrait convertir de l'UCS-4 en UTF-8.