我目前正在使用快速编程语言3.1快速学习。
在书中,它指出swift的String
和Character
类型完全符合unicode,每个字符由21位unicode标量值表示。每个角色都可以通过utf8,16,32查看。
我理解utf8和utf32如何在字节和位级工作,但我无法理解utf16如何在位级工作。
我知道对于代码点可以容纳16位的字符,utf16只是将字符表示为16位数字。但对于表示需要超过16位的字符,使用了两个16位块(我相信称为代理对)。
但是这两个16位的块如何以位级表示?
答案 0 :(得分:1)
utf16范围D800 ... DFFF保留。低于或高于该值的是简单的16位代码点。值D800..DBFF,减去D800,是FFFC之外的20位代码的高10位。接下来的两个字节包含低10位。当然,endianness进入了画面,使我们都希望我们可以使用utf8。叹息。
答案 1 :(得分:1)
除高代理和低代理代码点之外的任何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。