注意:我问的是 Microsoft Visual C++ 2008 上的实现定义的行为(可能与 2005+ 相同)。操作系统:Win7简体中文安装。
当我使用 执行非 ASCII I/O 时,我感到很惊讶printf
。例如
// 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");
输出:
Active code page: 936
C
中
English_United States.1252
?D
调试器中的内存占用显示它"中"
以两个字节编码:0xD6
, 0xD0
,这是代码页 936 中该字符的代码点,用于简体中文。它不应该在最有可能是的代码点范围"C" locale
内。0x0 ~ 0x7F
问题:
为什么它仍然可以在“C”语言环境中正确显示字符?所以我猜测语言环境与此无关printf
?"English"
但是,我会问,为什么切换到与 936 不同的 locale时就不能显示了?有趣的?
编辑:
我将标准输出重定向到一个文件并进行了一些测试。它表明无论设置什么语言环境,正确的字符"中"
都会保存在文件中。它表明这setlocale()
与控制台显示字符的方式有关,这与我对其工作原理的理解相矛盾:printf
将字节/代码点放入控制台的输入缓冲区,控制台使用自己的代码页(chcp
返回的内容)解释这些字节。