原因是vc的crt最终调用WriteFile写输入输出流,WriteFile对于控制台句柄是调用WriteConsoleA
WriteConsoleA使用当前控制台环境的代码页
因此printf和wprintf最终都得用ANSI编码调用系统服务
由于printf本身就是ansi,所以可以直接把字符串传给WriteFile
wprintf则要把unicode字符串转成ansi,此时用的locale是crt的,crt缺省的是POSIX locale,这个只有很少的功能,不能处理汉字,所以你需要调用setlocale
本文解析了VC的C运行时库(CRT)如何处理输入输出流的编码问题。CRT最终通过WriteFile进行读写,而WriteFile在控制台环境下会调用WriteConsoleA,使用当前控制台的代码页。这导致printf和wprintf必须使用ANSI编码。由于printf直接使用ANSI,可以将字符串直接传递给WriteFile;而wprintf需将Unicode字符串转换为ANSI,此过程由C运行时库的locale设置控制,默认的POSIX locale不支持汉字处理。
3647

被折叠的 条评论
为什么被折叠?



