本記事は、アーカイブに保存されている過去の記事です。最新の情報は、公益社団法人日本印刷技術協会(JAGAT)サイトをご確認ください。

Unicodeの最新動向

テキスト&グラフィックス研究会では6月25日にWindowsにおけるUnicode利用をテーマにしたtechセミナーを行なった。今回はその中から(株)イーストの渋谷誠氏によるUnicodeの基礎知識の部分をお伝えする。渋谷氏のお話はWindowsの対応まで含めた詳細で幅広い内容だったが,ここではUnicodeの基本的な説明部分をピックアップした。

1. 3つの規格
 Unicodeに関連しては,@Unicode Standard,AISO 10646,BJIS X 0221の3つの規格がある。これらは改訂時期の違いなどがあるが,利用のレベルとしてはほぼ同じと思ってよい。

 Unicode StandardはUnicode Consortiumで決めている規格である。マイクロソフト,ヒューレットパッカード,アップルなどが2バイトコードとして始めたもので,現在の仕様書のバージョンは2.1.9である。これは1999年4月に出たばかりだが,すでに3.0のドラフトも出ている。

 ISO 10646の正式な規格名は「Universal Multiple-Octet Coded Character Set」である。ISO/IECのJTC1/WG2というグループで作業を行なっているが,Unicode Consortiumのメンバーとだぶっている人も多い。1993年に10646-1という規格書が出て,その後随時追加が行なわれている。現在,1つのCorrectionと9つのAmendments,および15285というISO全体の通し番号を持つTechnical Reportが追加されている。それらすべてを含めて最新規格となる。これ1冊で最新版というものはない。

 JIS X 0221はISO 10646-1を翻訳した規格で,日本語レパートリーの定義が追加されている。これは,ISO規格に3欄併記されているCJK統合漢字について,どの文字が日本語の文字だと定義したものである。UnicodeはJISを全部含める方針で作ったので,第1第2水準も補助漢字も含まれている。ただ,中国・韓国の漢字と混ぜて並べ直されているので配列は全く異なり,コンバートには対応表が必要になる。

2. Unicodeの実際
 ISO 10646は本来4バイトコードである。2バイトで1つの面を表し,256面で群,128群で総計21億文字を扱うものである。ところがそこに2バイトコードのUnicodeが出てきたので,ISO 10646の最初の面をUnicodeと同じにしようとした。これが面0すなわちBMP(Basic Multilingual Plane)である。
 BMPは4バイトコードの上半分の2バイトが0000 0000で,これを除けば2バイトのUnicodeと一致する。これを特にUCS-2と呼び,これに対して4バイトのISO 10646をUCS-4という。

 そのほかにUTF-8とUTF-16がある。UTFとはUCS Transformation Formatの略で交換用のフォーマットという意味である。

@UTF-8
 UTF-8は,4バイトのUCS-4を1〜6バイトまでの可変長にするもので,おもにデータの圧縮を目的としている。
 まず,ISO 10646の「0000 0000〜0000 007F」(16進表記)までを「0xxx xxxx」(0と1のビット表記:ここでは1バイトになる)で表わす。
 次の「0000 0080〜0000 07FF」までは,1バイト目を110,2バイト目を10で始める「1110 xxxxx 10xxx xxx」(2バイト)で表わす。
 同様に次の「0000 0800〜0000 FFFF」は「1110 xxxx 10xx xxxx 10xx xxxx」(3バイト)で表わす。
 こうすればASCII文字は1バイトで済み,「0000 0080〜0000 07FF(かなに相当する部分)」は日本語のひらがな・カタカナやヨーロッパの文字まで入れて2バイトで済む。さらに3バイトで漢字を含めたBMPが全部収まることになる。
 UTF-8は,従来のASCIIと簡単にコンバートできて便利なのでJavaの内部的な処理などですでに使われている。問題は,漢字はUCS-2では2バイトなのにUTF-8にすると3バイトになって圧縮にならない可能性があることである。このためUTF-8は英語圏のための方法といってよいと思う。

AUTF-16
 UTF-16は,UTF-8とは違って圧縮が目的ではない。2バイトではBMP1面しかアクセスできないので,これを16面までアクセスできるように拡張する方法である。これはBMPの空間に漢字が入りきらなくなったための対策と考えてよいだろう。
 BMPの「D800〜DFFF」はもともとリザーブされていたエリアで,これを「D800〜DBFF」(ファーストコード)と「DC00〜DFFF」(セカンドコード)の2つに分け,2つで1文字とする。これをサロゲートペアという。
 一番先頭の「D800」と「DC00」を組み合わせた文字がUCS-4の00010000,つまりBMPの一つ上の1面の先頭の文字になる。セカンドコードを増やして「DFFF」まできたら今度はファーストコードを一つ増やして「D801」とする。こうして最後のコード「DBFF DFFF」が第16面の最後(0010 FFFF)となる仕組みである。
「D800〜DFFF」を窓のように使って空間を広げるという意味で,Shift-JISの考え方に似ている。ただ,Shift-JISは2バイトは特に規定がなく,文字を見たときにそれが2バイト目かどうか判定できないのに対して,UTF-16は2バイト目も範囲を規定している。だからたとえ処理できない場合でも前後の文字に影響することはない。
 Unicode Consortiumの最初の発想は2バイト固定長コードだったが,UTF-16のサロゲートペアでは2バイト×2=4バイトで1文字を表すわけで,2バイト固定長が通用しなくなっていることにご注意いただきたい。

3. 新しい動き
 Unicodeの3.0と同じものがISOにも入る予定だが,その中に日本に関係する大きな項目が2つある。ひとつは現在の漢字2万字を7万字に増やすSuper CJK,もうひとつは14面の「タグ」である。

@Super CJK
 Super CJKは新たに7万字の漢字を収集するものだが,現在収録されている2万字は除くので5万字の追加になる。これにはExtension AとBがある。
 Extension AはBMPの「3400」から「4DFF」に追加する。この領域はもとから空いていたわけではなくハングルが移動した跡である。残りの漢字約45000字は第2面に入り,これをExtension Bという。

Aタグ
 タグとは14面を使って文字ではなく制御コードを決めようというものである。現在,言語指定タグ,ルビタグ,異体字タグが提案されているが,いずれも詳細は未定である。

 言語指定タグはテキストが何語かという情報をコードとして埋め込もうというものである。しかし,Unicodeはそもそも文字コードであり,言語はHTMLのタグや文書フォーマットの上位の指定でやるべきだという批判が強い。

 ルビタグは言語タグよりももっと批判が多い。これはその名の通り,日本語で読みを小さい文字で書くいわゆるルビをコードとして埋め込もうというものである。日本からの代表は猛烈に反対しているが,通りそうな状況だという。

 異体字タグ(Variant Tag)は賛成意見が多い。Super CJKで増やす漢字には異体字が含まれる。これらを一列に並べて別の字とするのではなく,異体字を横に並べるというのが異体字タグである。すべての文字にコードを割り振るのではなく,異体字を含むある文字の集合を一つのコードで表し,異体字をその1番,2番,3番と並べるのである。こうすれば新たなコードは不要で,現在の16面までのコードスペースで処理できる。
(テキスト&グラフィックス研究会)
(JAGATinfo 1999年8月号より)

1999/10/20 00:00:00


公益社団法人日本印刷技術協会