关于 VC2008 中 wprintf 输出中文乱码问题
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2010/07/03/chinese-garbled-in-vc-wprintf/
最近写编码转换,发现MB编码转换成 Unicode 后,中文总是乱码。 起初以为是自己写错了,但测试后发现转换结果是完全正确的。 再测试一下,发现居然连常字符串都不能正常输出……
源代码:
1CharW ucs2s[] = L"我fsf我safas";
2wprintf(L"%s\r\n", ucs2s);
输出结果:?fsf?safas
带着疑问打开MSDN,发现原来 printf
函数有N个版本……
其中 Unicode 版本的如下
1int wprintf_s( const wchar_t *format [, argument]... );
2int _wprintf_s_l( const wchar_t *format, locale_t locale [, argument]... );
这两个函数有什么区别呢?locale_t
locale
?
不错,问题就在这里了。原来这个参数描述的是“本地语言”,也就是程序本地化的意思。输出前通常要通过这个参数设置输出文字的语言区域,例如中文。
说简单点,也就是微软为了实现本地化而加入的改动。
解决方法如下:
1、加入头文件 #include <Locale.h>
2、调用函数 _wsetlocale
或 setlocale
设置要使用的本地语言。如:
1_wsetlocale(LC_ALL, L"chs");
或者
1setlocale(LC_ALL, "chs");
此外,网上说 locale
对 prinft
和 printf_s
没有影响,这个似乎是如此。
但我在MSDN里看到的几乎对所有的 printf
、atoi
、atof
等字符串操作函数都有影响……
具体各位自己探索吧。
comments powered by Disqus