在Swift Programming Language 3.0中,关于字符串和字符的章节,书中说明了
Unicode标量是U + 0000到的范围内的任何Unicode代码点 U + D7FF包含或U + E000到U + 10FFFF(含)。 Unicode标量 不包括Unicode代理对代码点,这是代码 U + D800到U + DFFF范围内的点
这是什么意思?
答案 0 :(得分:2)
Unicode标量是一个未被序列化为一对UTF-16代码单元的代码点。
代码点是对Unicode标准中的字符进行编码所产生的数字。例如,字母A的代码点是0x41(或十进制的65)。
代码单元是代码点序列化中使用的每组位。例如,UTF-16使用一个或两个16位的代码单元。
字母A是Unicode标量,因为它只能用一个代码单元表示:0x0041。但是,不常见的字符需要两个UTF-16代码单元。这对代码单元称为代理对。因此,Unicode标量也可以定义为:除代理项对代表的代码点之外的任何代码点。
来自courteouselk的回答是正确的,这只是一个更简单的英文版本。
答案 1 :(得分:1)
来自Unicode FAQ:
问:什么是代理?
A:代理是来自两个特殊范围的Unicode值的代码点,保留用作UTF-16中成对代码单元的前导和尾随值。领先的,也称为高代理,从D800 16 到DBFF 16 ,尾随或低代理从DC00 16 到DFFF <子> 16 子>。它们被称为代理,因为它们不直接表示字符,而只是作为一对字符。
基本上,代理是为特殊目的而保留的代码点,并承诺永远不会自己编码字符,但始终作为一对UTF-16编码中的第一个代码点。
[UPD] 此外,来自wikipedia:
Unicode标准永久保留这些代码点值,用于高代理和低代理的UTF-16编码,并且永远不会为它们分配字符,因此没有理由对它们进行编码。官方的Unicode标准说没有UTF格式,包括UTF-16,可以编码这些代码点。
然而,UCS-2,UTF-8和UTF-32可以通过简单明了的方式对这些代码点进行编码,即使标准声明这种安排应被视为编码错误,大量软件也会这样做。只要两个代码单元的序列不能被解释为合法的代理对(也就是说,只要高代理是一个代理单元),就可以通过使用等于代码点的代码单元以UTF-16明确地对它们进行编码。从来没有一个低代理人。大多数UTF-16编码器和解码器实现在编码之间进行转换,就好像这样的情况 [citation needed] 并且Windows允许这些序列存在于文件名中。