如何正确初始化宽字符串?

kve*_*mbo 3 c c++ string char

我试图找出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},相反,它包含一个多余的字符,我认为这只是浪费空间。谁能帮助我了解这是怎么回事?

Ant*_*ala 6

您在这里要做的就是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 ++都没有在代码本身内指定源字符集的机制,因此,它始终是可以轻松复制粘贴的外部设置或选项。

  • @AnttiHaapala不在MSVC中的任何地方。MSVC记录了通过BOM的存在来检测UTF-8编码的源文件的行为。您仍然正确地说,这与UTF-8标准(不允许在文件开头忽略U + FEFF字符(BOM))以及ANSI C(在开头定义U + FEFF)不符合的文件是语法错误)。 (2认同)