2006年11月24日 12:30 [Edit]

Unicodeは文字集合か符号化方式か

以下は、電脳で文字を扱う場合の基礎中の基礎なのだが、肝心の記事に重大な誤りがいくつもある。

文字コード規格の基礎:ITpro
そろそろ具体的な説明に入ろう。最初にはっきりさせておく必要があるのは次の点だ。一般に「文字コード」と言う場合,
  1. 文字の集合
  2. エンコード方法
という要素がある。この二つを区別して考えることが重要だ。もちろん大きな関連はあるのだが,ごちゃごちゃのままでは「わからなく」なる大きな要因となる。

ここだ。

これによると、Unicodeは明らかに「エンコード方法」であるが、これは間違い。ここで書かれているものはUCS-2という名前のUnicodeが定めるいくつかの「エンコード方法」の一つであり、しかもUTF-16によって陳腐化した方式である。

まずUnicodeの定義であるが、これは Unicode Consortium が以下のように定めている。

http://unicode.org/glossary/
Unicode. The universal character encoding, maintained by the Unicode Consortium (http://www.unicode.org/). This encoding standard provides the basis for processing, storage and interchange of text data in any language in all modern software and information technology protocols.

これだけ見ると、確かに"character encoding"という言葉が出てくるので、文字集合ではなく符号化方式のように思えてくるが、上述のとおり、Unicode Consortiumは複数の符号化方式を定めていて、そしてここが重要なのだが、単一の文字集合を定めている。ゆえに、Unicodeと一言で言った場合は、文字集合を指すことが多いし、またそうあるべきである。符号化方式を指す場合は、UTF-7,UTF-8,UTF-16,UTF-32という呼び名を使うべきである。

それだけならまだいいのだが、肝心の符号化方式の説明の部分も間違いだ。Unicodeといった場合には、U+0000からU+10ffffまでのID(このIDをUnicodeと呼ぶ)を全て符号化できなくてはならないが、UCS-2はU+ffffまでしか表現できない。だから「陳腐化」したと書いてある。

2オクテットで表現される、Javaにおけるcharである「Unicode」は、実はUTF-16である。文字集合はU+0000からU+10ffffであり、よく使われるU+0000〜U+ffffは1 "char"で表現できるが、U+10000〜U+10ffffを表現する際には2 "chars"が必要だ。文字集合としてUnicodeの部分集合(subset)であるU+0000〜U+ffffは、BMP (Basic Multilingual Plane)という。あくまでBasicなのだ。

文字コード規格の基礎:ITpro
現在のバージョン2.1には32ビットで1文字を表現する仕組みが取り入れられており,「16ビット固定」という当初の概念は崩れつつある。ただ,現時点でそこに割り当てられた文字はまだない。

UnicodeはすでにVersion 5.0.1が登場していて、実地に使われているのがだいたい4.1.0。もちろんBMP以降のPlane(文字面)もすでに使われている。これはいくら何でもひどすぎる。

UTF-8の説明もこれまたひどい。ギリシャ文字などUTF-8で2オクテット表現のものも通常Shift_JISやEUC-JPで扱う文字集合の中に入っているし、「月に亀」の𪚲 (U+2A6B2)はUTF-8の表現では\xF0\xAA\x9A\xB2, 4オクテットである。JIS X 0213をすべて表現するには、4オクテット必要なのだ。

このあたりの事情は、Encode::Supportedにさんざん書いたので、むしろそちらを参照して欲しい。というよりこれよりまともなオンラインの解説がいまだにないのが残念でならない。誰か翻訳してくれないかなあ。私はEncode本体の保守で手一杯なので。

ちなみに、この問題に関しては数ある技術書よりまず「電脳社会の日本語」を一読することをお薦めする。文字集合と符号化方式のHowだけではなく、「なぜUnicodeがこのような(へんてこな)設計になったか」というWhyまで解説されているものは、Webを丹念に検索すればいくつも出てくるけど、本にまでまとまったものは少ない。文字コードの問題を語るなら、せめてこの本をクリアしておいて欲しいものだ。


See Also:

Dan the Encode Maintainer


この記事へのトラックバックURL

この記事へのトラックバック
「404 Blog Not Found:Unicodeは文字集合か符号化方式か」...
電脳社会の日本語【kawaguti's chronical record】at 2006年12月27日 01:47
この記事へのコメント
どうして誰も指摘しないのかなぁ。仕方がないので。昨年の 12 月の纏めの方も変です。

(1) Unicode と、ISO 10646 が区別できていません。UTF-32 の定義も変。
(2) 最もよく目にする場所のひとつで、unicode が UTF-16 に対応する「使うべき名称」として指定されています。大昔 (10年近く前) から。

http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset4.asp

元記事のように Microsoft の世界のなかで説明するなら、元記事のとおり Unicode と書くのは変ではなく、満点とはいわないまでも責められる理由はないでしょう。だいたい ISO 10646 UCS2 の IANA 登録にしてからが Alias csUnicode ですし。

もちろん、表の中のコードの範囲は「間違って」いますけど、文章で補われているので許せる範囲かなぁ。誤解を招きやすいので、こういう言葉遣いをするな、ということなら賛成はしますけど。
Posted by かねこ at 2006年11月28日 17:09
当時はEUC-JPにも似たような脳内サブセット現象があったような。
半角カナは使えないとか、全角文字は2バイトとか。

あと、UTF-16を指してUnicodeと称しているのはWindowsが元凶だから仕方がないような気も。
Posted by UGN(仮称) at 2006年11月27日 20:39
ただし、当時においても突っ込まれても仕方ない点はありますね。「電脳社会の日本語」が出た頃は、この問題について最後の抵抗をしている人はいましたが、大勢はあきらめとともに受け入れるという感じだったように記憶しています。
Posted by kilo at 2006年11月24日 16:48
印刷用ページにすると、確かに一番最後に

出典:日経ソフトウエア 1999年10月号 86ページより
(記事は執筆時の情報に基づいており,現在では異なる場合があります)

とでていますね。普通のページ閲覧だと記事の日付が2006/11/22となっているので、情報の鮮度に関して誤解を招いても仕方ないかも。
Posted by kilo at 2006年11月24日 15:45
日付を見るとこの記事は1999年のものですから。
今さらアップロードするのはどうかと思いますが、筆者のせいでない部分もそれなりにありそう。
Posted by ま。 at 2006年11月24日 15:09