GoldenCrystal (./550) :
Heuuu... "Le reste du monde" n'utilise pas UTF-8.
Par "reste du monde", je veux dire "tous les autres OS modernes", donc GNU/Linux, OS X, *BSD etc.
UTF-8 est idéal pour l'échange de données (et encore, UTF-16 remplit bien ce rôle aussi), mais pour le reste, c'est complètement sous-optimal, c'est pour ça que "Le reste du monde" n'utilise pas UTF-8...
Euh si, tous les OS modernes à part celui de Redmond (enfin bon, l'appeler "moderne" c'est déjà être gentil

) utilisent l'UTF-8 comme leur charset système (celui du locale) par défaut.
Les seuls à utiliser UTF-8 de manière native, ce sont les programmes dégeu codés de manière dégueu sous Linux, ce qui inclue ici, et à juste titre de toutes façons, GTK...
L'UTF-8 est le charset natif de GNU/Linux, point final. GTK+ utilise le charset du locale en interne, donc il utilise l'UTF-8.
Même Qt que tu affectionnes tant n'utilisent pas ce truc impropre à la programmation qu'est UTF-8. Ce qui est tout à fait logique.
QString utilise effectivement l'UTF-16, surtout pour des questions historiques: quand le support Unicode a été rajouté dans Qt 2, ils ont pris l'UCS-2 qui était à l'époque plus ou moins synonyme de "Unicode" (surtout parce que c'était à longueur constante), et c'est resté parce que ce serait le bordel de porter toutes les applications utilisant
QString (en pratique, toutes les applications Qt) vers un
QString utilisant autre chose, ils ont juste rajouté le support des surrogate pairs UTF-16 dans Qt 4 (c'était supporté dans une certaine mesure dans les derniers Qt 3, mais Qt 4 est le premier à les supporter pleinement).
Mais ça ne change rien au fait que pour parler aux APIs natives de GNU/Linux, il y a une conversion en le charset du locale qui est normalement l'UTF-8. L'UTF-16 n'est qu'une représentation interne, les entrées-sorties (fichiers, console, autres libs, …) sont en général en UTF-8.
Et ce qui me dérange n'est pas l'utilisation de l'UTF-16 comme charset interne dans W32 et .NET, mais le fait que le locale charset n'est pas Unicode et donc on ne peut pas utiliser les APIs standard et portables sans perdre de l'information. L'intérêt de l'UTF-8, c'est qu'il peut être utilisé comme locale charset de par sa compatibilité ASCII et donc remplacer les charsets non-Unicode obsolètes. Ensuite, je veux bien qu'on utilise l'UTF-16 (Qt le fait aussi), les conversions entre UTF-16 (valide) et UTF-8 (valide) sont sans pertes, donc ce n'est pas trop grave si les 2 sont utilisés, tant que ça reste de l'Unicode. Mais les charsets obsolètes doivent partir et la solution proposée d'abandonner totalement le locale charset (alors que les APIs portables de base l'utilisent, parfois de manière obligatoire (cf.
main;
wmain n'est pas standard!) et que
wchar_t n'est pas une bonne alternative non plus étant donné que même sa taille est variable de système en système) n'est pas du tout pratiquable (du moins dans un programme même un minimum portable), la seule solution viable est de rendre le locale charset Unicode (donc UTF-8, étant donné qu'un
char de plusieurs octets causerait le bordel direct).