サロゲートペア

またメモになります。要推敲というより書きかけです。難しくてうまく書けないです。しかもすごい間違ってたので修正しました(すみません)。



UTF-16では、2つの文字コードを組み合わせて拡張文字を表現できるが、この組み合わせのことをサロゲートペアと呼ぶ。
UCS-2は2バイト固定長なので、論理的には 0xFFFF = 65,535 個の文字が表現できる。一方、サロゲートペアでは、UCS-2の文字領域と同じ大きさの領域16面分、つまり 0xFFFF * 16 = 1,048,560 個の文字が表現できる。
サロゲートペアに使用できる文字コードは決められていて、1つめ(上位)には0xD800〜0xDBFFが、2つめ(下位)には0xDC00〜0xDFFFが、それぞれ使用される。
各面の区点オクテットから実際のサロゲートペアを導く方法は以下のとおり。

上位サロゲート(1つめの文字コード
( 面の番号 − 1 ) × 0x0040 + ( 区点オクテット ¥ 0x0400 ) + 0xD800
下位サロゲート(2つめの文字コード
( 区点オクテット mod 0x0400 ) + 0xDC00

例えば、15面の0xFFFFのサロゲートペアは次のようにして求める。

  • 1つめの文字コード: ( 15 - 1 ) * 0x0040 + ( 0xFFFF \ 0x0400 ) + 0xD800 = 0xDBBF
  • 2つめの文字コード: ( 0xFFFF mod 0x0400 ) + 0xDC00 = 0xDFFF

つまり、サロゲートペアは「0xDBBF, 0xDFFF」となる。
※ちなみに、サロゲートペア「0xDBBF, 0xDFFF」は区点オクテット0xFFFFであるため、Unicodeの仕様として文字は割り当てられない。