在有关问题的基础上,我想询问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编码和类型工具。
u"\U0010FFFF"
编码为代理对。 - kennytm