#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的在线文档:
codecvt<wchar_t,char,mbstate_t>:
converts between native wide and narrow character sets.
这个程序是用VC++编译的,在Windows上运行。
在这个程序中,内部字符集是UCS-2,由VC++编译器定义;外部字符集,即窄字符集,是控制台环境下的GBK(中文字符集)。如果文档为真,则wcout
可以将 unicode 字符串从 UCS-2 转换为 GBK f1()
;但是,事实并非如此。为什么?