我试图找出c中的宽字符。例如,我测试了一个包含单个字母“?”的字符串。在utf8中编码为c492。
char* T1 = "?";
//This is the resulting array { 0xc4, 0x92, 0x00 }
wchar_t* T2 = L"?";
//This is the resulting array { 0x00c4, 0x2019, 0x0000 }
Run Code Online (Sandbox Code Playgroud)
我期望第二个数组为{0xc492,0x0000},相反,它包含一个多余的字符,我认为这只是浪费空间。谁能帮助我了解这是怎么回事?
您在这里要做的就是mojibake。您的源代码以UTF-8编写,但在Windows代码页1252中进行了解释(即,编译器源字符集为CP1252)。
宽字符串内容是转换为UCS-2的UTF-8字节0xC4 0x92 的Windows代码页1252个字符。在最简单的出路是只使用一种逃避,而不是:
wchar_t* T2 = L"\x112";
Run Code Online (Sandbox Code Playgroud)
要么
wchar_t* T2 = L"\u0112";
Run Code Online (Sandbox Code Playgroud)
更大的问题是,据我所知,C和C ++都没有在代码本身内指定源字符集的机制,因此,它始终是可以轻松复制粘贴的外部设置或选项。