Note : Je demande un comportement défini par l'implémentation qui est sur Microsoft Visual C++ 2008 (peut-être le même sur 2005+). OS : installation chinoise simplifiée de Win7.
Ça me surprend quand j'effectue des entrées/sorties non ASCII avec printf
. Par exemple
// This won't be necessary as it's the system default code page.
//system("chcp 936");
// NULL to show current locale, which is "C"
printf ("%s\n", setlocale(LC_ALL, NULL));
printf ("\n");
printf ("%s\n", setlocale(LC_ALL, "English"));
printf ("\n");
Sortie :
Active code page: 936
C
English_United States.1252
?D
L'empreinte mémoire dans le débogueur montre que ""
est codé en deux octets : 0xD6
, 0xD0
qui est le point de code de ce caractère dans la page de code 936, pour le chinois simplifié. Il ne devrait pas se trouver dans la plage de codets de la page 936. "C" locale
qui, le plus probable c'est 0x0 ~ 0x7F
.
Pregunta:
Pourquoi le caractère s'affiche-t-il toujours correctement dans la locale "C" ? J'ai donc supposé que la locale n'avait pas d'influence sur l'affichage du caractère. printf
? Mais alors, je me demande pourquoi il ne s'affiche plus lorsqu'on passe en mode "English"
locale, qui est également différente de 936 ? Intéressant ?
Edit :
J'ai redirigé la sortie standard vers un fichier et fait quelques tests. Il montre que, quelle que soit la locale choisie, le caractère correct ""
est enregistré dans le fichier. Il suggère que setlocale()
est lié à la façon dont la console affiche le caractère, ce qui contredit ma compréhension de son fonctionnement : printf
met les octets/points de code dans le tampon d'entrée de la console, qui interprète ces octets à l'aide de sa propre page de code (ce que le chcp
retours).