\x/\u/\u字符引用可以与所有字符串类型自由组合吗?
没有。\x
可以用于任何事情,但是\u
和\U
只能在特定UTF编码的字符串中使用。但是,对于任何UTF编码的字符串,\u
和\U
你认为合适就可以使用。
是否所有字符串类型都是固定宽度的,即数组包含的元素与文字中所显示的一样多,还是将\x/\u/\u引用展开成一个可变的字节数?
不是你的意思。\x
, \u
,和\U
基于字符串编码进行转换。这些“代码单位”的数量(使用Unicode术语)。一个char16_t
是一个UTF-16代码单元)值取决于包含字符串的编码。文字u8"\u1024"
将创建包含2的字符串。char
S加上空终止符。文字u"\u1024"
将创建包含1的字符串。char16_t
加上一个空终止符。
使用的代码单元数基于Unicode编码。
u“和U8”字符串是否具有编码语义,例如,是否可以说char16tx[]=u“\u0010FFFF”,而非BMP编码点被编码成两个单元的UTF 16序列?
u""
创建一个UTF-16编码字符串。u8""
创建一个UTF-8编码字符串。它们将按照Unicode规范进行编码。
在(1)中,我可以用\u写单独的代孕词吗?
绝对不是。该规范明确禁止使用utf-16代理项对(0xD8000xDFff)作为代码点。\u
或\U
.
最后,是否有任何编码字符串函数(即它们是字符感知的,并且可以检测无效的字节序列)?
绝对不是。好吧,请允许我换个说法。
std::basic_string
不处理Unicode编码。他们当然可以商店被编码的字符串。但他们只能把它们看作是char
, char16_t
,或char32_t
他们不能把它们看作是用特定机制编码的Unicode码点序列。basic_string::length()
将返回代码单位的数量,而不是代码点。显然,C标准库字符串函数是完全无用的。
但是,应该注意的是,Unicode字符串的“长度”并不意味着代码点的数量。一些代码点正在组合“字符”(一个不幸的名称),这与以前的代码点结合在一起。因此,多个编码点可以映射到单个视觉字符。
实际上,IoStreams可以读写Unicode编码的值。要做到这一点,您必须使用区域设置来指定编码,并将其正确地注入到不同的位置。这说起来容易做起来难,而且我没有任何代码向你展示如何做到这一点。