今日は,「いまさら人に聞けないUnicode」について
Unicodeっていっても,UCSとかUTFとか人に説明できますか?
実は奥深いUnicodeの世界へ,Let's Go!
……というわけで,タイトルは釣りです(何
べ,べつにあなたのために書いたんじゃないんだからね!!
この前に「
そのうち書きたい」って言ったから,書くだけなんだからっ!
まず,Unicodeってなんじゃらほいってところから
すごく単純にいうと,「Unicode = UCS + UTF」です
# 世界中の文字を網羅した文字を扱う規格,のような教科書的な話は今回はしません
# もうちょっと技術的なUnicodeの話をします
このUCSとUTFの関係はUnicodeを語る上で非常に重要です
まず,この関係をきっちりと理解してください
重要なことなのでもう一度いいます
「Unicode = UCS + UTF」です
じゃあ,UCSとかUTFとかってなんなのか
グロッサリには以下のように定義されています
UCSとは「Universal Character Set」
UTFとは「Unicode (or UCS) Transformation Format」
この定義のとおりなんだけど,もっと砕いていうと
UCSは「文字集合」で,UTFは「文字符号化方式」
たとえば「字」という文字は
「UCS」では「U+5B57」にマッピングされてます
これを「UTF」のひとつ,「UTF-8」で符号化すると「0xE5 0xAD 0x97」となるし
「UTF-16」で符号化したら「0x5B 0x57」になります
同様に,「UTF-32」なら「0x00 0x00 0x5B 0x57」のように表されます
# エンディアンネスについては今は考えません
つまり,「UCS」で一意に定義されている文字を
どうやって取り出すか,表現するかを定めるのが「UTF」
文字じたいは「UCS」に載ってて
その文字をどう呼ぶかを定義するのが「UTF」と思ってください
もう少し具体的に述べるなら,Shift_JISやEUC-JPと同列にくるのが「UTF」
これはいわゆる文字コードです
JIS第1第2水準漢字とかJIS補助漢字とかと同列にくるのが「UCS」
言ってしまえば,「ただ文字を集めたもの」です
ではここまでの話をまとめます
「Unicode = UCS(文字集合) + UTF(表現方法)」
ここからはUCSとUTFについて,もうちょっと詳しく見ていきます
まずはUCSについて
UCS(Unicodeの文字集合)には2つあります
UCS-2は16bitで文字集合を表し,UCS-4は32bitで表現します
つまり,UCS-2は65535字,UCS-4はおよそ43億字を文字集合に含むことができます
# 正確には,UCS-4の最上位ビットは「0」と決まっているので
# UCS-4は31bit・約21億字です
今,UCSといったら暗黙的にUCS-4を指します
UCS-4はUCS-2の完全上位互換なので,今はUCS-2は使われていません
より正確には,UCS-4がUCS-2を完全に内包しているので
わざわざUCS-2という呼称を使う必要がないのです
UCS-2は,UCS-4でそのまま定義されています
このUCS-2にあたる部分は,UCS-4では
BMP(Basic Multilingual Plane・基本多言語面)としてそのまま存在します
# 初期のPS3で,PS2のソフトを動かすために
# PS2のCPUとGPUをそのまま載っけてたのとよく似ていますw
どうしてこんなことになったのか
UCS-2というのは,Unicodeにとって大きな黒歴史なのです
最初にUnicodeを提唱したのは,欧米の人々です
彼らは基本的に,ASCIIしか使いません
ウムラウトやセディーユのようなダイアクリティカルマークを使う文化があるとはいっても
使う文字の数(文字集合の大きさ)はたかが知れています
そう,最初,Unicodeを提唱した人々は
世界中の文字がなんと65,535字(16bit)の範囲内に収まると思っていたのです
中国の有名な「字」の辞典に「康煕字典」というものがあるのですが
この辞書に掲載されている文字数は49,030あります
これだけで,なんと16bitで表現できる文字集合の75%弱を使い切ってしまいます
もちろん,世界中には漢字の他にも,ひらがなやカタカナ
英数字・各種記号・キリル文字・アラビア文字・ハングルなど
数え切れないほどの「文字」があります
早々に,UCS-2は文字集合としての容量の限界に達し
破綻を来してしまうのです
話がそれてしまいました
要するに,現在Unicodeの文字はすべてUCS-4に含まれています
いま,UCS-2を考える必要はありません
文字の集合としてUCS-2を指す場合は
「UCS-4のBMP」もしくは単に「BMP」という方が正確と言えます
では次に,UTFについて見ていきましょう
UTFには様々な種類があります
現在,よく使われているのは以下の3つでしょう
それぞれ順に,重要な特徴を述べておきます
具体的な符号化方式などについては,規格書を読んでください
UTF-8
- ASCIIの上位互換
- ASCIIとして読んでも,ASCIIの部分だけは読める
- ASCII以外は,可変長(16・24・32bit)で表現
- エンディアンによる問題がない
- サロゲートペアを利用する必要がない
- UCS-4をすべて表現可能
- 現在の仕様(RFC3629)ではUTF-16と同じ表現範囲に制限されているが,理論的にはすべて表現できる
- RFC3629で置き換えられる前のRFC2279では,このような制限はなかった
なお,BOM(Byte Order Mark)付きものを「UTF-8」,BOMなしを「UTF-8N」とする
表記法がたまに見受けられますが
これらは規格で決まっているわけではないので注意が必要です
UTF-16
- 本来は,UCS-2を16bit固定長で表現するのが目的
- UCS-4の一部(~U+10FFFF)を表現するために,サロゲートペアを用いた32bit長の表現も可能
- U+110000以上のコードポイントにある文字は表現不能
- バイトオーダ依存で,UTF-16LEとUTF-16BEがある
- Windows APIやJavaの内部文字コードとして利用
UTF-32
- 32bitの固定長表現
- UCS-4をすべて表現可能
- バイトオーダ依存で,UTF-32LEとUTF-32BEがある
これらの他に,ほとんど使われていないものに以下のものがあります
UTF-7は未だにXSSあたりで現役のようですが……
よく目にするのはUTF-8です
この方式は,UTF-16における混乱の原因ともなったサロゲートペアを使いません
さらには,エンディアンによる問題とも無縁です
固定長で文字を表現することが必要な場合は
基本的にUTF-32が用いられます
UTF-16はサロゲートペアの出現により,可変長表現になってしまいました
UTFについてまとめると以下のことが言えます
現在,よく使われているUTFにはいくつかの方式がある
それぞれ,用途と使用するシチュエーションによって適切なものが使い分けられている
こんなところでしょうか
Unicodeについて,少しはわかってもらえたでしょうか?
このドキュメントが,誰かのために活用されたなら幸いです
次回は,余力があれば「おもしろいUnicode」について書きたいと思います
乞うご期待w