En VC++ 2003, je pouvais simplement enregistrer le fichier source en UTF-8 et toutes les chaînes étaient utilisées telles quelles. En d'autres termes, le code suivant imprimerait les chaînes telles quelles sur la console. Si le fichier source était enregistré en UTF-8, la sortie serait UTF-8.
printf("Chinese (Traditional)");
printf(" ()");
printf(" ()");
printf("Chinês (Tradicional)");
J'ai enregistré le fichier au format UTF-8 avec la nomenclature UTF-8. Cependant, la compilation avec VC2008 donne le résultat suivant :
warning C4566: character represented by universal-character-name '\uC911'
cannot be represented in the current code page (932)
warning C4566: character represented by universal-character-name '\uAD6D'
cannot be represented in the current code page (932)
etc.
Les personnages à l'origine de ces avertissements sont corrompus. Ceux qui correspondent à la locale (dans ce cas, 932 = japonais) sont convertis dans l'encodage de la locale, c'est-à-dire Shift-JIS.
Je n'arrive pas à trouver le moyen de faire compiler ce fichier par VC++ 2008. Notez que la locale que j'utilise dans le fichier source n'a pas d'importance. Il ne semble pas y avoir de locale qui dise "Je sais ce que je fais, alors ne changez pas mes chaînes de caractères". En particulier, l'inutile pseudo-locale UTF-8 ne fonctionne pas.
#pragma setlocale(".65001")
=> error C2175: '.65001' : invalid locale
Le "C" non plus :
#pragma setlocale("C")
=> see warnings above (in particular locale is still 932)
Il semble que VC2008 force tous les caractères dans la locale spécifiée (ou par défaut), et cette locale ne peut pas être UTF-8. Je ne veux pas modifier le fichier pour utiliser des chaînes d'échappement comme " \xbf\x11... "parce que la même source est compilée avec gcc qui peut très bien traiter les fichiers UTF-8.
Existe-t-il un moyen de spécifier que la compilation du fichier source ne doit pas toucher aux chaînes de caractères ?
Pour poser la question différemment, quels drapeaux de compilation puis-je utiliser pour spécifier la compatibilité rétroactive avec VC2003 lors de la compilation du fichier source, c'est-à-dire ne pas modifier les chaînes de caractères, les utiliser telles quelles, octet par octet.
Mise à jour
Merci pour les suggestions, mais je veux éviter les wchar. Étant donné que cette application traite exclusivement des chaînes de caractères en UTF-8, l'utilisation de wchar m'obligerait à reconvertir toutes les chaînes de caractères en UTF-8, ce qui ne devrait pas être nécessaire. Toutes les entrées, sorties et traitements internes sont en UTF-8. C'est une application simple qui fonctionne bien telle quelle sous Linux et lorsqu'elle est compilée avec VC2003. Je voudrais pouvoir compiler la même application avec VC2008 et qu'elle fonctionne.
Pour que cela soit possible, il faut que VC2008 n'essaie pas de le convertir dans la locale de ma machine locale (japonais, 932). Je veux que VC2008 soit rétrocompatible avec VC2003. Je veux une locale ou un paramètre de compilation qui dit que les chaînes de caractères sont utilisées telles quelles, essentiellement comme des tableaux opaques de chars, ou en UTF-8. Il semble que je sois coincé avec VC2003 et gcc, VC2008 essayant d'être trop intelligent dans ce cas.
1 votes
Voir une réponse pour les versions plus récentes de VS : stackoverflow.com/questions/19987448/
0 votes
Je viens de rencontrer ce même problème dans VS 2012. Il bousille mon encodage UTF-8. Pourquoi VS est-il si cassé ? Je pense que je vais juste mettre mes données dans un fichier externe où elles ne seront pas gâchées. Avoir besoin de travailler autour d'un compilateur bogué est assez ennuyeux. BTW, C++11 permet à l'encodage d'être spécifié comme u8 "literal", mais VS 2012 ne supporte pas cela, donc n'est d'aucune aide.