2000/04/06 [木]
UNICODE は、単一の 16bit に全世界のすべての文字をコード化して入れるという方針で作成された文字コード体系です。しかし、全世界のすべての文字を 16bit の中に入れることは不可能です。例えば、漢字だけで数万文字あります。その結果として UNICODE の当初の試みはあっさり破錠しました。そこでなんとか収録できる文字数を増やそうとして追加したのがこのサロゲートという考えです。
ここで用語を定義します。8bit をオクテット、16bit をバイトとします。すると、当初の UNICODE は、2オクテット、1バイトのコード体系を目指していたということになります。さてサロゲートというのは要するに、1 バイトの UNICODE 文字 2 つのペアで一つの文字をあらわすということです。つまり、2 バイトで一文字をあらわすということです。これは ASCII 文字に対するマルチバイト文字と同じ考え方です。
さて、ではどのようにして 1 バイトの文字と 2 バイトの文字を判別するのでしょうか? 実は、特定のコード領域がそのために割り当てられています。
この上位サロゲートと下位サロゲートをペアにして一文字を指定します。上位サロゲートと下位サロゲートのコード領域が分離しているため、後方から文字列をスキャンしても、そこがサロゲートペアであることが認識できるようになっています。具体的な組み合わせ方法は次の通りです。
このサロゲートをペアにして表現する文字を ISO10646 にマップするときには、0x00010000-0x0010FFFF の領域にマップすることになっています。計算式は、おそらく ((上位バイト-0xD7C0)<<10)+(下位バイト-0xDC00) ではないかと思います。
ここで用語を定義します。8bit をオクテット、16bit をバイトとします。すると、当初の UNICODE は、2オクテット、1バイトのコード体系を目指していたということになります。さてサロゲートというのは要するに、1 バイトの UNICODE 文字 2 つのペアで一つの文字をあらわすということです。つまり、2 バイトで一文字をあらわすということです。これは ASCII 文字に対するマルチバイト文字と同じ考え方です。
さて、ではどのようにして 1 バイトの文字と 2 バイトの文字を判別するのでしょうか? 実は、特定のコード領域がそのために割り当てられています。
UNICODE | 名前 |
---|---|
D800-DB7F | 上位サロゲート (High Surrogate) |
DB80-DBFF | 上位私的利用サロゲート (Private Use High Surrogate) |
DC00-DFFF | 下位サロゲート (Low Surrogate) |
上位バイト | 下位バイト | 名前 |
---|---|---|
D800-DB7F | DC00-DFFF | サロゲート (Surrogate) |
DB80-DBFF | DC00-DFFF | 私的利用サロゲート (Private Surrogate) |
by seclan