程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> wprintf、wcout輸出中文和unicode中文字符串的轉換問題,wprintfwcout

wprintf、wcout輸出中文和unicode中文字符串的轉換問題,wprintfwcout

編輯:C++入門知識

wprintf、wcout輸出中文和unicode中文字符串的轉換問題,wprintfwcout


本來想搞明白點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;
復制代碼

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved