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