2005年12月20日 11:45 [Edit]
備忘録: Unicode, UCS, and UTF
Character Set (文字集合) vs. Encoding (符号化)
まずこの二つが別物だということを抑えましょう。UCSというのは名前からわかる通り、Character Set (文字集合)です(とはいえ、Unicode.orgのGlossaryを見ると、符号化の一手段にも見えなくはない)。この段階では、各文字は「背番号」を持っているに過ぎません。狭義の「Unicode」はこの「背番号」を指します。
これをどう実際のデータにするのかがEncoding (符号化)。UTF (Unicode Transfer Format) はUnicodeにおけるその規格、現在UTF-7、UTF-8、UTF-16、UTF-32の4種類があり、うちUTF-16とUTF-32はさらにEndian別に-BE、-LEに分かれます。さらにUnicode.orgの規格ではないけどUnicodeを符号化する手法としてはPunicodeなんてのもあります(後述)
原理的に、UnicodeではU+0000からU+7FFFFFFFまでの2^31種類の文字を割り当てる事ができますが、現規格ではUTF-16でも符号化しきれるU+0000からU+10FFFFまでの17*2^16種類しか使わない決まりになっています。
UTF-7
これはUnicodeを7-bitの文字列に符号化するための規格。U+7FFFFFFFまで符号化できます。例えば「小飼弾」は+XA+Y/F8+-となります。あまり使われていません。
UTF-8
現在最も使われているUnicodeの符号化規格がこれです。U+7FFFFFFFまで符号化できます。例えば「小飼弾」はbyte表記で[e5 b0 8f e9 a3 bc e5 bc be]となります。
UTF-16やUTF-32と違ってエンディアンによる問題がなく、ASCIIはそのまま符号化するため、I18N(国際化)を考慮していない昔のソフトでもほぼ無修正で扱える(ただしこの場合には、あくまでbyte列を右から左に流しているだけで、きちんと文字を文字として扱っていないことに注意)、文字列の境界がはっきりしている*0などの扱いやすい特長が多いため普及が進みました。
ただし、漢字はほとんど3byte表記になるため、特に日本語環境では少しかさばるという欠点もあります。
UTF-16
U+0000からU+FFFFまではそのまま16bit整数、U+10000からU+10FFFFまではいわゆる Surrogate Pair という一対の16bit整数で符号化する規格。Javaでcharというとこれになります。U+10FFFFまでしか符号化できません。Unicodeの現規格の制限はここから来ています。
Windows、Mac OS Xなど多くのOS、そしてJavaの内部文字コードとしてよく使われています。
実はこの規格、Unicodeを巡る混乱の大本にもなっています。当初Unicodeはあくまで16bitに収まる範囲の文字集合を想定していたのにも関わらず、「やっぱり足りない」ということになって泥縄的にこの規格が加わったのです。この辺の混乱とUnicodeコンソーシアムの強引さは、冒頭で紹介した「電脳社会の日本語」に詳しく説明されています。
quinta essentia - del.icio.us買収, Yonah"Unicode"という表現にバージョンまで付記しないと混乱するなぁ。
バージョンで言うと2.0以降。はっきり言ってそれ以前の規格はシカトして構いません。
UTF-32
U+0000からU+7FFFFFFFまで、全部そのまま素直に32bit整数で表記したのがこの規格。最も「素直な」規格ですが、最も使われていません。
Punycode
国際化ドメインで採用された符号化規格。既存のDNS Serverでそのまま扱えるように符号化するのが特長です。RFC 3492で規格化されています。プロ以外はあまり知る必要のない規格でしょう。
UnicodeとPerl
Perl 5.8では内部で扱う文字コードもUTF-8です。それ以外のUTFはすべてEncodeモジュールで扱うことが出来ます。ちなみに私がメンテしております。
Punycodeに関しては、miyagawa君がEncode::Punycodeをリリースしているので、それをCPAN経由でInstallするだけで使えるようになります--なるはずだったのですが、Punycode規格成立前のReleaseだったのか、Test Suiteがスエてます(xn---が頭に付いていない)。というわけでmiyagawa君の早急なる対応をきぼんぬ:-)
Dan the Encode Maintainer
この記事へのトラックバックURL
Thanx, revised.
Dan the Man to Err
正:U+10000からU+10FFFF…
では。
あ、本当ですね。直しました。古い記事なのにありがとうございます。
Dan the Typo Generator