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

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

本文參考文章:http://blog.csdn.net/wzcprince/archive/2009/07/11/4340699.aspx


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章