4

C++11 2.3/2 说:

通用字符名 \UNNNNNNNN 指定的字符是 ISO/IEC 10646 中字符短名称为 NNNNNNNN 的字符

所以我下载了ISO/IEC 10646,但我找不到“字符短名称”的定义。有人可以澄清一下这应该指的是什么吗?

我最初的目标是找出为什么在使用 \U 指定代码点时需要 8 个十六进制数字,因为 6 位数字总是足够的。所以我也很想知道为什么 C++11 指定我们使用 \UNNNNNNNN 而不是 \UNNNNNN。

4

2 回答 2

6

Unicode 字符代码表中,每个字符都有一个全名和一个短名。例如字符/有全名SOLIDUS和短名002F。并非巧合的是,所有字符短名称都可以用十六进制表示。

至于为什么必须指定 8 位数字,我怀疑这是为了与可能使用更大/更多字符块的 Unicode 标准的未来版本向前兼容。

于 2012-09-24T22:45:01.827 回答
1

我冒昧地猜测我们上次被 Unicode 家伙咬了:C++ 最初是wchar_t这样设计的,它可以容纳所有可能的 Unicode 字符。为此,它至少需要保存 16 位,因为 Unicode 最多只能使用 16 位。在一个流行的实现决定实际使用 16 位wchar_t类型后不久,人们发现 16 位实际上是不够的。上次我看 Unicode 使用 20 位,但为什么又赌太短了?不太可能广泛使用 24 位类型,如果您需要使用特定的代码点,最喜欢只使用 16 位,即您可以使用\uNNNN.

2.3 [lex.charset] 第 2 段中的描述似乎表明通用字符名称是指代码点。同时,universal-character-name 用于指代字符短名称。我不是 Unicode 专家,但我认为代码点是有意义的。

于 2012-09-24T22:42:45.683 回答