关于Visual C++ 2008中wprintf和wprintf_s输出中文乱码问题

最近写编码转换库,发现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、调用函数 _wsetlocalesetlocale 设置要使用的本地语言。如:

_wsetlocale(LC_ALL,L"chs");

或者

setlocale(LC_ALL,"chs");

此外,网上说 localeprinft printf_s 没有影响,这个似乎是如此。

但我在MSDN里看到的几乎对所有的  printfatoiatof 等字符串操作函数都有影响。。。
setlocale的具体用法参照:http://blog.csdn.net/whatday/article/details/9734781


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值