先日も「IVS飲み会」(なにそれ!)に潜入した話を紹介したが、書籍『Unicode IVS/IVD入門』に対するNAOIさんの苛烈なツッコミの成果が、ブログ記事にまとまった。

『Unicode IVS/IVD入門』へのツッコミ(Mac OS Xの文字コード問題に関するメモ)

こんな豪華な正誤表が無料で読めるなんて、まことにありがたい。



ツッコまれまくっている本はそれだけ愛されているわけで、やはり間違いが多い本の著者としてはねたましい限りである。

さて、上記のブログにも書かれているが、Unicodeと言えば有名な「サロゲートペア」についてここでちょっと復習する。
もともとUnicodeは、16ビット65536文字で賄えるだろうと考えられていた。
(1993年に策定されたUnicode 1.1)
実際、Unicode 1.1の時点では、34,233字しか埋まっていなかった。

漢字が当然入らないと言われていたのだが、日本、中国、台湾は国をまたがって似た字が多いだろうからそれを統合すれば入るとか言われていた。
この考え方をHan Unificationと言う。
当時は「Unicodeという米国の大企業が決めた規格で漢字がどんどん消えていく!」という情緒的な反対論が日本の文化人の間で澎湃と湧き起った。
実を言うと、ぼくがコンピューターと文字の問題に真剣に関心を持ったのはこの頃であるが、そういう人多いんじゃないだろうか。
いろいろと衝突や誤解があるおかげで、関心を呼び、理解が深まるのはいいことだと思う。
実際、16ビット固定長の考え方はすぐに捨て去られ、Unicodeのおかげでかえって使える漢字がグッと増え、さらに最近IVSのおかげでさらに増えようとしている。
野放図に増やすのも問題だが、米国の大企業のせいで必要な漢字が消えることはなくて本当に良かった。

一方、国際規格であるISO/IEC 10646では、32ビットを8ビットずつ4つに分け、群(group)、面(plane)、区(row)、点(cell)の4つにコードを割り振る4次元コード表を考えていた。
実際には群は7ビットとしていたので、128群×256面×256区×256点=231=2,147,483,648だから20億文字ぐらい入れられるようにすることを構想していた。
(ちなみに231の計算はGoogleで2**31を検索すると出てくるから便利)

※後述するが、群は廃止された。

このISO/IEC 10646における31ビットの文字コードがUCS-4で、そのうちの1群1面の256区×256点=65,536文字をUCS-2と呼び、Unicode 1.1と互換とした。
このUCS-4の1群1面のことをBMP(基本多言語面 Basic Multilingual Plane)と言う。

Unicodeの文字は、U+XXXXという16進数の先頭にU+を付けた番号で表す。
これをUnicodeコードポイントとかUnicodeスカラー値と言う。
(英語の発音として正しくはUnicodeスケイラー値だと思うがscalarは日本ではスカラーで定着している。)

UCS-2はBMP、U+0000からU+FFFFまでの16ビットで表せる文字集合のことである。
ただし実際には最後の2個、U+FFFE、U+FFFFは非文字(文字として使ってはいけない文字)であるので、BMPの範囲はU+0000からU+FFFDまでである。

BMPはベーシックと言うぐらいで、すぐに足りなくなったので、UCS-2は廃止となり、BMP以外の面にも字を入れることになった。

U+10000~U+1FFFDまでをSMP(Supplementary Multilingual Plane 補助多言語面)と言う。

栄えあるU+10000はこういう字だ。

仮面ライダークウガに出てきそうな字であるが、これは線文字Bの1つであり、紀元前1450年ぐらいからギリシャで使われていた文字で、クレタ島のクノッソス宮殿跡から見つかった粘土板を解読するために使われた字である。
U+1FFFFEとU+1FFFFFは非文字である。

U+20000~U+2FFFFまでをSIP(Supplementary Ideograph Plane 補助漢字面)と言う。

U+20000はこういう字だ。

やはり仮面ライダークウガに出てきそうな字であるが、これはボポモフォ文字(注音記号)と言って中国語の発音を写すために使われる字だ。

BMP以外ってそんな字ばっかりなんですかと言われそうだが、実際にはこのSIPにJIS X 0213で追加された日本で使う漢字がいっぱい入っている。

漢字の検索はUnihan Databaseが便利である。

𠀋(U+2000B)は丈という字に点がついた異体字で、ボクサーの辰吉𠀋一郎氏のジョウの字が正しくはこれだそうである。
ぼくはSIPの代表選手として「2000B」「点付きの丈」というのが覚えやすいのでこの字を覚えておくようにしている。

他にも𡚴(U+216B4)はアケビという字で、JIS X 0208に収録されているものの用途が分からない幽霊文字の一つとして有名になった「妛」の正しい字である。

このように、現在では実用的な字がバンバンBMP以外の字に入っている。
当初から、各国の文字コード追加要求は相次ぎ、16ビットで足りないことは明らかであった。
しかしながら、Unicodeは16ビット固定長で走り出してしまった。

この折り合いをつけるためにUnicode 2.0(1996年)に提案され、Unicode 3.1(2001年)に実装されたのがUTF-16である。

UTF-16では、以下の部分の文字を「サロゲート領域」として確保した。

前半:0xD800-0xDBFF(1,024コードポイント)
後半:0xDC00-0xDFFF(1,024コードポイント)

で、BMPに収まらない部分はこのサロゲートを2文字分使って1文字を表すことにした。
これがサロゲートペアである。
1,0242だから、1048576文字で、言ってしまえば100万文字である。
(代わりにU+FFFDまでの範囲からは2,048コードポイントが文字としては使えなくなる。)

まとめると、

・Unicode 1.1が16ビットで提案される。当初収録されたのはおよそ34000字
・ISO/IEC 10646が(UCS-4)31ビットで提案される(UCS-4)
・うちの1群1面(BMP)16ビットをUCS-2と呼び、Unicode互換とする
・UCS-2では足りなくなる
・このためUTF-16が提案される
・UTF-16のうち2,048のコードポイントはサロゲート領域と呼び、文字としては使えない
・サロゲート領域のコードは16ビットずつ組み合わせて1,0242=1048576文字が使える

よって、UTF-16として使えるコードポイントは、非文字を考えなければ、

216(もともとのBMP)
+1,0242(サロゲートペアで増えた分)
-2,048(サロゲートで使う分)

だから、1,112,064コードポイントが使用可能である。
1,112,064は16進数で10F800であるから、UCS-4で言うと1群16面までしか入らない。

ということで、UCS-4から「群」の概念はなくなった。
そんなにいらねーよ!

カンタンに言うと、

・Unicodeは当初65000文字ぐらいでいいと思っていた
・一方ISO/IEC 10646は20億文字ぐらい使えるようにしようと思っていた
・Unicodeはすぐに足りなくなったので、65000文字のうち2000文字分をサロゲートエリアとし、1000文字ずつ組み合わせるサロゲートペアを導入して100万文字まで増やした
・ISO/IEC 10646もUnicodeに合わせて100万文字までしか使わないことにした

という状態である。

では、U+10000以上の文字をサロゲートペアに変換する計算を研究しよう。
その前にちょっと休憩していいですか。


Subscribe with livedoor Reader
Add to Google
RSS
このエントリーをはてなブックマークに追加