如果是这样,默认“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可能无法 显示所有字符。
谢谢。