關於Visual C++ 2008中wprintf和wprintf_s輸出中文亂碼問題

whatday發表於2013-08-03
最近寫編碼轉換庫,發現MB編碼轉換成 Unicode 後,中文總是亂碼。

起初以為是自己寫錯了,但測試後發現轉換結果是完全正確的。

再測試一下,發現居然連常字串都不能正常輸出……

CharWucs2s[] = L"我fsf我safas";
wprintf(L"%s\r\n",ucs2s);

輸出結果:?fsf?safas

帶著疑問開啟MSDN,發現原來 printf 函式有N個版本……

其中 Unicode 版本的如下

intwprintf_s( const wchar_t *format [,argument]... );
int_wprintf_s_l( const wchar_t *format, locale_tlocale [, 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


相關文章