UTF-16のサロゲートペアとは?

UTF-16のサロゲートペアという概念について、自分なり調べた結果のメモ。

 

ザックリ一言で言うと、ザロゲートペアとは

UTF-16でUnicodeの文字をすべて表現するための苦肉の策

です。

 

まずサロゲートペアを知るためには、Unicodeの歴史を知る必要があります。

そもそもUnicodeは「世界中の文字をすべて表現できるようにしよう!」と考えられた文字コードです。

作られた当初は「2バイトあれば世界中の文字をすべて表現できるだろう」と考えられており、2バイト固定長でした。

2バイトってことは「65535通り」ってことですからね。
そりゃそれだけあれば足りるだろって思いますよね普通。

 

さらに符号化方法も「2バイトをそのまま符号化しよう」という単純なものでした。

例えば「ABC」という文字はそれぞれ

  • A:U+0041
  • B:U+0042
  • C:U+0043

というコードポイント(「この番号はこの文字にしよう」な対応表みたいなもの)であり、それぞれのバイト列もまた

  • A:0x0041
  • B:0x0042
  • C:0x0043

という「コードポイントをそのまま2バイトで表現しちゃおう」という方式でした。つまり「UTF-16の2バイトしか対応していないバージョン」って感じですね。

 

しかし当初の予想は外れて、世界中の文字を収録するには2バイトではまったく足りませんでした。

世界には「65535個」以上の文字があるってことですね。すごいですよね。

ちなみに今現在は13万7929個の文字がUnicodeに登録されているらしいです。

 

それはともかく、「2バイトじゃ足りない!」となったので、「2バイト以上に拡張しよう!」という方向になったのですが、2バイト以上に拡張してしまった場合、今まで2バイト固定長で作ったプログラムが動かなくなってしまいます。

例えば、今までは「A」のコードポイントは

  • A:U+0041

で、バイト列は

  • A:0x0041

だったのに、3バイト固定長に拡張した場合、バイト列は

  • A:0x000041

になってしまい互換性がなくなってしまいます。

 

この問題について偉い人たちが

「どうにかして使用できる文字を増やしたい・・!!」
「でも
互換性も保ちたい・・!!」

と考えた結果、苦肉の策として作られたのがサロゲートペアです。

 

どういうことかというと

「このままじゃ全然足りないよね」と判明した直後にも、まだ空き領域が2万文字くらいあったらしいのですが

その2万文字の空き領域の中の

  • 前半:U+D800 〜 U+DBFF
  • 後半:U+DC00 〜 U+DFFF

という2つの領域のコードポイントを組み合わせて、1024 × 1024 = 1,048,576文字を表せるようにしよう!・・・という仕組みがサロゲートペアなのです。

 

なのでUTF16では

  • 前半:U+D800 〜 U+DBFF
  • 後半:U+DC00 〜 U+DFFF

の間のコードポイントは1つだけでは意味をなしません。2つ並べて初めて文字として意味をなします。

 

 

・・・というのがサロゲートペアの概念です。

 

ちなみにサロゲートペアは、日本語で「代用対」という意味らしく、要するに「代わりに使用されるになる文字」という意味ですが

概念を理解してから知ると「ああなるほど・・」ってなりますよね。

 

おわり

コメント

タイトルとURLをコピーしました