本來想搞明白點wchar_t,就寫了個很簡單的wcout的例子,結果中文無法輸出,然後換成wprintf,卻還是不行~於是在網上搜啊搜,總算解決了問題,總結一下: 試著運行下麵的代碼: wchar_t *ws = L"你好"; wcout << ws << endl; 這樣沒有任何輸出,必須將loc ...
本來想搞明白點wchar_t,就寫了個很簡單的wcout的例子,結果中文無法輸出,然後換成wprintf,卻還是不行~於是在網上搜啊搜,總算解決了問題,總結一下: 試著運行下麵的代碼:
wchar_t *ws = L"你好"; wcout << ws << endl;這樣沒有任何輸出,必須將locale設為本地語言,就是在wcout前加入下麵這句話就可以:
std::wcout.imbue( locale(locale(), "", LC_CTYPE) );也可以指定中文語言:
//註:如果無效,可以試試把 LC_CTYPE 改成 LC_ALL
std::wcout.imbue( locale(locale(), "chs", LC_CTYPE) );很多資料用這句話wcout.imbue(locale("")),這樣會改變wcout的所有locale設置,比如int型的1234會顯示成1.234 可是wprintf還是不可用,必須在使用前把C語言的locale設置成本地語言:
setlocale( LC_CTYPE, "" );//或者"chs"但這個設置是全局的,後果就是會讓cout和wcout無法再輸出中文,所以我們在用完後必須設置回原來的:
setlocale( LC_CTYPE, "" ); wprintf( L"%s", L"你好" ); setlocale( LC_CTYPE, "C" );一般情況下"C"就是原來的,但也可能不是,這時候我們可以將老的locale保存,用完後還原:
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE, "" ); wprintf( L"%s", L"你好" ); setlocale( LC_CTYPE, old_locale );
wofstream本沒有想用,不過既然查到了就一併記下來:
在預設的locale下,ofstream能正確輸出中文到文件中,但不支持中文文件名,wofstream支持中文文件名,但不能向文件中輸出中文。要解決這個問題,需要在打開文件之前將全局locale設為本地語言。將全局locale設為本地語言後,ofstream和wofstream的問題都解決了,但 cout和wcout卻不能輸出中文了,所以還是要將全局locale恢複原來的設置:
locale &loc=locale::global(locale(locale(),"",LC_CTYPE)); ofstream ofs("你好.txt"); wofstream wofs(L"你好.txt"); locale::global(loc); ofs<<"test測試"<<1234<<endl; wofs<<L"Another test還是測試"<<1234<<endl;
wchar_t*與char*的轉換函數wcstombs和mbstowcs也需要類似設置才有效,下麵是一個例子:
wchar_t *ws = L"你好嗎"; char cs[10]; wchar_t ws2[10]; unsigned int len = 2 * ( wcslen(ws) + 1 ); char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); setlocale( LC_CTYPE, "" ); wcstombs( cs, ws,len ); mbstowcs( ws2, cs, len ); setlocale( LC_CTYPE, old_locale ); cout << cs << endl; std::wcout.imbue( locale(locale(), "", LC_CTYPE) ); wcout << ws2 << endl;