2013-09-21 61 views
0
#include <iostream> 

using namespace std; 

void f1() 
{ 
    wcout.imbue(locale("chs")); 
    wcout << L"您" << endl; 
} 

void f2() 
{ 
    locale loc(wcout.getloc(), new codecvt<wchar_t, char, mbstate_t>()); 

    wcout.imbue(loc); 
    wcout << L"好" << endl; 
} 

int main() 
{ 
    f1(); // OK 
    f2(); // Error. There is no output as expected. 
} 

根據cplusplus.com的在線文檔:爲什麼std :: codecvt <wchar_t,char,mbstate_t>不能像定義的那樣工作?

codecvt<wchar_t,char,mbstate_t>: 

    converts between native wide and narrow character sets. 

這個程序編譯VC++,和在Windows上運行。

在此程序中,內部字符集是UCS-2,由VC++編譯器定義;外部字符集,即窄字符集,在控制檯環境中是GBK(中文字符集)。如果文檔是真的,則wcout可以將UCS-2的Unicode字符串轉換爲GBK,如f1()所示;但是,它沒有。爲什麼?

+2

更好的文檔:['std :: codecvt'](http://en.cppreference.com/w/cpp/locale/codecvt)。 – IInspectable

回答

2

您已經默認構建了一個std::codecvt,沒有特定的轉換規則。它無法知道您需要GBK而不是GB18030或UTF-8。

方式來獲取wchar_t的轉換爲GBK一個的codecvt:

  • 構造爲GBK的std::locale只使用與您的流,無需拉出一個小

    wcout.imbue(std::locale("")); // this uses the current user settings, 
    wcout.imbue(std::locale("zn_CN.gbk")); // or name the locale explicitly, 
                 // by whatever name Windows calls it 
    
  • 構建該面直接與std::codecvt_byname

    wcout.imbue(std::locale(wcout.getloc(), 
          new std::codecvt_byname("zh_CN.gbk")); // explict name 
    
  • 寫自己的轉換程序,並從std::codecvt派生,所以你可以用

    wcout.imbue(std::locale(wcout.getloc(), new yourcodecvt); 
    

爲C++語言環境支持Windows使用它很可憐,但是,WinAPI的可能有更適當的轉換功能。

相關問題