我没有在 C 标准中找到如何处理上述宽字符串中的转义序列的解释。
例如:
wchar_t *txt1 = L"\x03A9";
wchar_t *txt2 = L"\xA9\x03";
这些是否以某种方式处理(例如在每个字节前加上 \x00 字节)或存储在内存中的方式与此处声明的方式完全相同?
还有,L前缀是如何按照标准操作的?
编辑:
让我们考虑一下txt2。它将如何存储在内存中?\xA9\x00\x03\x00 还是 \xA9\x03 写的?\x03A9 也是如此。这会被视为一个宽字符还是被视为两个单独的字节,它们将被制成两个宽字符?
编辑2:
标准 说:
反斜杠后面的十六进制数字和十六进制转义序列中的字母 x 被视为整数字符常量的单个字符或宽字符常量的单个宽字符的构造的一部分。如此形成的十六进制整数的数值指定所需字符或宽字符的值。
现在,我们有一个 char 文字:
wchar_t txt = L'\xFE\xFF';
它由 2 个十六进制转义序列组成,因此应将其视为两个宽字符。如果这些是两个宽字符,它们不能放入一个 wchar_t 空间(但它在 MSVC 中编译),在我的情况下,这个序列被视为如下:
wchar_t foo = L'\xFFFE';
这是唯一的十六进制转义序列,因此是唯一的宽字符。
编辑3:
结论:每个八进制/十六进制序列都被视为一个单独的值( wchar_t *txt2 = L"\xA9\x03"; 由 3 个元素组成)。wchar_t txt = L'\xFE\xFF'; 不可移植 - 实现定义的功能,应该使用 wchar_t txt = L'\xFFFE';