在将数据发送到控制台之前,std :: wcout是否会根据当前关联的std :: locale对象更改字符的编码?

时间:2013-06-18 11:24:00

标签: c++ unicode stdout iostream ostream

如果是这样,默认“C”-locale的目标编码是什么?

我试图用一个简短的测试代码回答这个问题,但结果不一致:

BOOL success = SetConsoleOutputCP(1252);

// characters are saved using UTF-16 here (OS: windows)
wchar_t char_a    = L'a';     // exists in ascii 
wchar_t umlaut    = L'ö';     // exists in local codepage (1252)
wchar_t euroSign  = L'€';     // exists in local codepage (1252)
wchar_t omega     = L'Ω';     // unicode bmp
wchar_t pileOfPoo[] = L"";  // unicode, surrogate, beyond bmp 


//std::locale loc("German_Germany.1252"); 
//std::wcout.imbue(loc);

// conversion from UTF-16 to target encoding specified in locale
std::wcout << char_a << std::endl;      
std::wcout << umlaut << std::endl;      
std::wcout << euroSign << std::endl;
std::wcout << omega << std::endl;
std::wcout << pileOfPoo << std::endl;


// --- Results ---


// Test 1: Default 'c'-locale:
// a -> works
// ö -> works
// euroSign -> does not work
// omega -> does not work (expected)
// pileOfPoo -> does not work (expected)


// Test 2: Locale: German_Germany.1252
// a -> works
// ö -> works
// euroSign -> works
// omega -> does not work (expected) (but outputs "0" why?)
// pileOfPoo -> does not work (expected)

我已将控制台输出更改为代码页1252(本地代码页),以便于阅读。 这里以UTF-16编码的字符似乎是依赖于std :: locale转换的。但是我不理解 为什么变音符号有效,欧元符号没有。如果“c”-local使用ASCII编码作为目标编码,那么非ASCII字符应该起作用,因为没有 相应的人物。但是变音符号有效,所以我假设默认转换是本地代码页(1252)。我的本地代码页包含变音符号和欧元符号, 但只有变形金刚字符有效。

std :: cout(narrow-version)是不是真的没有转换字符所以保存到输出宽字符串转换为UTF-8,唯一的缺点就是windows console可能无法 显示所有字符。

谢谢。

0 个答案:

没有答案