Maidsphere

2011.5.26

今日は,「いまさら人に聞けない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 なお,BOM(Byte Order Mark)付きものを「UTF-8」,BOMなしを「UTF-8N」とする 表記法がたまに見受けられますが これらは規格で決まっているわけではないので注意が必要です UTF-16 UTF-32 これらの他に,ほとんど使われていないものに以下のものがあります UTF-7は未だにXSSあたりで現役のようですが…… よく目にするのはUTF-8です この方式は,UTF-16における混乱の原因ともなったサロゲートペアを使いません さらには,エンディアンによる問題とも無縁です 固定長で文字を表現することが必要な場合は 基本的にUTF-32が用いられます UTF-16はサロゲートペアの出現により,可変長表現になってしまいました UTFについてまとめると以下のことが言えます 現在,よく使われているUTFにはいくつかの方式がある それぞれ,用途と使用するシチュエーションによって適切なものが使い分けられている こんなところでしょうか Unicodeについて,少しはわかってもらえたでしょうか? このドキュメントが,誰かのために活用されたなら幸いです 次回は,余力があれば「おもしろいUnicode」について書きたいと思います 乞うご期待w