在swift中,utf16代理对如何表示

时间:2017-03-27 05:02:57

标签: swift unicode utf-8 bit utf-16

我目前正在使用快速编程语言3.1快速学习。

在书中,它指出swift的StringCharacter类型完全符合unicode,每个字符由21位unicode标量值表示。每个角色都可以通过utf8,16,32查看。

我理解utf8和utf32如何在字节和位级工作,但我无法理解utf16如何在位级工作。

我知道对于代码点可以容纳16位的字符,utf16只是将字符表示为16位数字。但对于表示需要超过16位的字符,使用了两个16位块(我相信称为代理对)。

但是这两个16位的块如何以位级表示?

2 个答案:

答案 0 :(得分:1)

utf16范围D800 ... DFFF保留。低于或高于该值的是简单的16位代码点。值D800..DBFF,减去D800,是FFFC之外的20位代码的高10位。接下来的两个字节包含低10位。当然,endianness进入了画面,使我们都希望我们可以使用utf8。叹息。

答案 1 :(得分:1)

"Unicode Scalar Value"

  

除高代理和低代理代码点之外的任何Unicode代码点。换句话说,整数0到D7FF 16 和E000 16 到10FFFF 16 的范围包括在内。

每个 Unicode标量值可以表示为一个或两个UTF-16代码单元的序列,如 Unicode Standard

  

D91 UTF-16编码格式

     

Unicode编码格式,将U + 0000..U + D7FF和U + E000..U + FFFF范围内的每个Unicode标量值分配给具有与Unicode相同数值的单个无符号16位代码单元标量值,并根据表3-5将U + 10000..U + 10FFFF范围内的每个Unicode标量值分配给代理对。

Table 3-5. UTF-16 Bit Distribution

Scalar Value              UTF-16
xxxxxxxxxxxxxxxx          xxxxxxxxxxxxxxxx
000uuuuuxxxxxxxxxxxxxxxx  110110wwwwxxxxxx 110111xxxxxxxxxx

Note: wwww = uuuuu - 1

在"补充平面"中有2个 20 Unicode标量值。 (U + 10000..U + 10FFFF),这意味着20位足以编码 所有这些都在代理对中。从技术上讲,这是通过减去来完成的 从将值拆分为两个10位的块之前的值0x010000。