1. はじめに
文字コードが異なる環境間でのデータ転送時に、サロゲートペアと呼ばれる文字の変換が必要となる場合があることを知りました。そこで、サロゲートペアについて調べた内容をまとめます。
2. サロゲートペアが誕生した経緯
普通、Unicodeでは1文字につき2バイトのデータを使います。この2バイトには65536通り(0x0000~0xFFFF)のビットが表現できます。Unicodeの本来のアイディアは、この約6万字で世界中の文字を表現しようというものでした。
また、日本語の場合、全角でも半角でも1文字あたり2バイトのデータを使います(例えば、"a"も"あ"も2バイト)。そのため、「文字数 × 2 = 使用バイト数」という関係がいつも成り立ち、使用バイト数を2で割れば文字数を簡単に導き出せました。これは文字列を1文字ずつ処理する場合など、便利な側面がありました。
しかし、最近ではUnicodeに組み込みたい文字の要望が増え、2バイトでは足りなくなってきました。そのため、解決策としてサロゲートペアと呼ばれる手法が導入されました。これは、「1文字=2バイト」の基本は保ちつつ、一部の文字については「1文字=4バイト」となる方法です。
具体的には、以前は未使用だった0xD800~0xDBFF(1024通り)を「上位サロゲート」、0xDC00~0xDFFF(1024通り)を「下位サロゲート」とし、「上位サロゲート+下位サロゲート」で1文字を表現するようにしました。
「上位サロゲート」も「下位サロゲート」も、以前のUnicodeの文字コードと被らないように未使用の領域を利用しています。サロゲートペアの導入により、追加で1024×1024=1048576文字の領域が利用可能となりました。
2. サロゲートペアの具体例
2.1 絵文字
😀 |😁 |😂 |😃 |😄 |😅 |😆 |😇 |😈 |😉 |😊 |😋 |😌 |😍 |😎 |😏
😐 |😑 |😒 |😓 |😔 |😕 |😖 |😗 |😘 |😙 |😚 |😛 |😜 |😝 |😞 |😟
😠 |😡 |😢 |😣 |😤 |😥 |😦 |😧 |😨 |😩 |😪 |😫 |😬 |😭 |😮 |😯
😰 |😱 |😲 |😳 |😴 |😵 |😶 |😷 |😸 |😹 |😺 |😻 |😼 |😽 |😾 |😿
🙀 |🙁 |🙂 |🙅 |🙆 |🙇 |🙈 |🙉 |🙊 |🙋 |🙌 |🙍 |🙎 |🙏
2.2 JIS第1・第2水準に含まれない文字
﨑、彅、𠮷、㐂、繫、𠀋
2.3 おわりに
サロゲート文字について理解を深めていただけたら幸いです。