\x/\u/\U 字符引用是否可以与所有字符串类型自由组合?
No. \x
可以用在任何东西上,但是\u
and \U
只能用于专门 UTF 编码的字符串。但是,对于任何 UTF 编码的字符串,\u
and \U
可以按照您认为合适的方式使用。
所有字符串类型都是固定宽度的,即数组包含与文字中出现的元素一样多的元素,还是将 \x/\u/\U 引用扩展为可变数量的字节?
不是按照你的意思。\x
, \u
, and \U
根据字符串编码进行转换。这些“代码单元”的数量(使用 Unicode 术语。Achar16_t
是 UTF-16 代码单元)值取决于包含字符串的编码。字面意思u8"\u1024"
将创建一个包含 2 的字符串char
s 加一个空终止符。字面意思u"\u1024"
将创建一个包含 1 的字符串char16_t
加上一个空终止符。
使用的代码单元数量基于 Unicode 编码。
u"" 和 u8"" 字符串是否具有编码语义,例如我可以说 char16_t x[] = u"\U0010FFFF",并且非 BMP 代码点被编码为两个单元的 UTF16 序列吗?
u""
创建 UTF-16 编码的字符串。u8""
创建一个 UTF-8 编码的字符串。它们将按照 Unicode 规范进行编码。
在(1)中,我可以用\u写单独的代理吗?
绝对不。该规范明确禁止使用 UTF-16 代理对 (0xD800-0xDFFF) 作为代码点\u
or \U
.
最后,是否有任何字符串函数能够识别编码(即它们能够识别字符并且可以检测无效的字节序列)?
绝对不。好吧,请允许我重新表述一下。
std::basic_string
不处理 Unicode 编码。他们当然可以storeUTF 编码的字符串。但他们只能将它们视为序列char
, char16_t
, or char32_t
;他们不能将它们视为使用特定机制编码的 Unicode 代码点序列。basic_string::length()
将返回代码单元的数量,而不是代码点的数量。显然,C 标准库字符串函数完全没用
但应该注意的是,Unicode 字符串的“长度”并不意味着代码点的数量。一些代码点正在组合“字符”(一个不幸的名称),它与前一个代码点组合。因此多个代码点可以映射到单个视觉字符。
Iostream 实际上可以读取/写入 Unicode 编码值。为此,您必须使用区域设置来指定编码并将其正确地注入到各个位置。这说起来容易做起来难,而且我身上没有任何代码来向您展示如何操作。