最佳答案
在 相关问题之后,我想了解一下 C + + 11中的新字符和字符串文字类型。看起来我们现在有四种字符和五种字符串文字。字符类型:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
还有字符串:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
问题是: \x
/\u
/\U
字符引用是否可以与所有字符串类型自由组合?所有的字符串类型都是固定宽度的吗? 也就是说,数组包含的元素和文字中显示的一样多吗? 或者 \x
/\u
/\U
引用被扩展成可变的字节数?u""
和 u8""
字符串是否具有编码语义,例如,我可以说 char16_t x[] = u"\U0010FFFF"
,并且非 BMP 的编码点被编码成两个单元的 UTF16序列?u8
也是如此吗?在(1)中,我可以用 \u
写单独的代理吗?最后,是否有任何字符串函数能够识别编码(例如,它们能够识别字符并能够检测无效的字节序列) ?
这是一个有点开放式的问题,但我希望尽可能完整地了解新 C + + 11的新 UTF 编码和类型设施。