目录

Surrogate Pair笔记

引言

Surrogate Pair是UTF-16中用于扩展字符而使用的编码方式,是一种采用四个字节(两个UTF-16编码)来表示一个字符。

  • 中文名

    代理对

  • 外文名

    surrogate pair

概述

在UTF-16中,在范围U+0000到U+FFFF间的码点使用一个单一的16位编码单元表示。但是,随着国际字符的不断增加,16位编码空间无法满足编码的要求。   UNICODE标准组织UTF-16优化了基本多语言平面(BMP, Basic Multilingual Plane)中字符的表示,即位于U+0000到U+FFFF范围内的字符。该范围包含了世界上所使用的书写系统中的绝大多数字符,每个字符只需要一 个16位的编码单元。对于基本多语言平面,UTF-16可作为固定宽度的编码格式来有效使用。   但对于增补字符,UTF-16需要两个16位的编码单元,意味着正式的UTF-16是一个变宽的编码格式。就在范围U+10000到U+10FFFF间的编码则使用一对16位编码单元表示,称作代理对(surrogate pair)。

UTF-16是早期Unicode遗留下的历史产物,原本被设计成具有固定宽度的16位编码格式。为支持超过U+FFFF的增补字符,设立了代理机制。

编码规则

在BMP内的字符,仍然按照UTF-16的编码规则,使用两个字符来表示。 [1] (注:BMP内的字符编码,不包含从U+D800到U+DFFF的预留码位。这些预留码位就恰好用于扩展字符编码)

增补字符的编码值已经超过了BMP的编码范围,所以,需要使用一对UTF-16字符来表示一个字符。UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。编码规则如下:

  • 如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数。

  • 如果U≥0x10000,

    • 我们先计算U’=U-0x10000,
    • 然后将U’写成二进制形式:yyyy yyyy yyxx xxxx xxxx,
    • U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

这两个字符就称为surrogate pair(代理对)。第一个代理字符为16位编码,范围为U+D800到U+DFFF,第二个代理字符也是一个16位编码,范围为U+DC00 to U+DFFF。