複製鏈接
請複製以下鏈接發送給好友

surrogate pair

鎖定
Surrogate Pair是UTF-16中用於擴展字符而使用的編碼方式,是一種採用四個字節(兩個UTF-16編碼)來表示一個字符。
在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的增補字符,設立了代理機制。
中文名
代理對
外文名
surrogatepair

目錄

surrogate pair編碼規則

在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。
參考資料