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つ並べて初めて文字として意味をなします。
・・・というのがサロゲートペアの概念です。
ちなみにサロゲートペアは、日本語で「代用対」という意味らしく、要するに「代わりに使用される対になる文字」という意味ですが
概念を理解してから知ると「ああなるほど・・」ってなりますよね。
おわり
コメント