Swift中的Unicode标量值

时间:2016-10-26 07:31:15

标签: swift unicode

在Swift Programming Language 3.0中,关于字符串和字符的章节,书中说明了

  

Unicode标量是U + 0000到的范围内的任何Unicode代码点   U + D7FF包含或U + E000到U + 10FFFF(含)。 Unicode标量   不包括Unicode代理对代码点,这是代码   U + D800到U + DFFF范围内的点

这是什么意思?

2 个答案:

答案 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允许这些序列存在于文件名中。