2

如果是这样,默认“C”语言环境的目标编码是什么?

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

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 控制台可能无法显示所有字符。

谢谢你。

4

0 回答 0