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

in swift, how utf16 surrogate pair is represented in bit

我目前正在使用 swift 编程语言 3.1 这本书学习 swift。

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

我了解 utf8 和 utf32 在字节和位级别的工作原理,但我无法理解 utf16 在位级别的工作原理。

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

但是这两个16位块是如何以位级别呈现的?

utf16 范围 D800...DFFF 已保留。低于和高于的值是简单的 16 位代码点。值 D800..DBFF 减去 D800,是 FFFC 之外的 20 位代码的高 10 位。接下来的两个字节包含低 10 位。当然,字节顺序的问题让我们都希望我们可以只使用 utf8。叹息

一个"Unicode Scalar Value"

Any Unicode code point except high-surrogate and low-surrogate code points. In other words, the ranges of integers 0 to D7FF16 and E00016 to 10FFFF16 inclusive.

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

D91 UTF-16 encoding form

The Unicode encoding form that assigns each Unicode scalar value in the ranges U+0000..U+D7FF and U+E000..U+FFFF to a single unsigned 16-bit code unit with the same numeric value as the Unicode scalar value, and that assigns each Unicode scalar value in the range U+10000..U+10FFFF to a surrogate pair, according to Table 3-5.

Table 3-5. UTF-16 Bit Distribution

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

Note: wwww = uuuuu - 1

"Supplementary Planes"中有220个Unicode标量值(U+10000..U+10FFFF),表示20位足以编码 所有这些都在代理对中。从技术上讲,这是通过减去 0x010000 来自值,然后将其拆分为两个 10 位的块。