■日本語の表現(2)■

↑

多バイト方式

さて、前文書で2バイト系の日本語コードについて見て来たのだが、結局、アルファベットの大文字・小文字・1バイト系カタカナ・日本語を全て丸くおさめて、統一的に扱うことのできる体系はシフトJISのみであった。

つまり、2バイト(16bit)系のシステムにおいては、シフトJISが最も優秀なコードということになる。しかし、実は以前から一部のワープロ専用機などでは、3バイトの日本語コードが使用されていた。これは先頭1バイトで文字の種別を指定し、残りの2バイトに実際のコードを入れる。

この方法を使うと、シフトJISでサポートしている字種に加えて、1バイト系ひらがななども問題なく使用できる。実は似たようなことをしているのが、新EUCである。

新EUC

EUC(Extended Unix Code) は UNIXの世界で日本語を扱うために1985年に定められたコード表現体系である。この EUC の規格の策定にあたっては色々な所の思惑が交錯して、難航し、そのこと自体がこのコードの普及を疎外した。

結果的にはこのコードはUNIXの世界のローカルコードという形になってしまい、純粋なUNIX以外では、UNIXの直系OSともいうべきLinuxくらいでしか使われていない。

当初からEUCには、1バイト系カタカナが扱えないという困った問題があった。これに対して、それを扱わざるを得ないミニコン/ワークステーションメーカーでは、独自の拡張をして、1バイト系カタカナを使用した。

新EUCは1991年に草案がまとめられた。

これは主として1990年に登場したJIS補助漢字(JIS-X0212)を処理するために定められた規格である。

結果的にこの新しい規格では、JIS補助漢字はシフトコードを使って3バイトで表現することにした。そして、ついでに1バイトカタカナも組み込むことにし、これもシフトコードを使うことにした。結果的に新EUCは次のような構成になる。

  ANK    そのまま     長さ1バイト
  JIS基本漢字  MSBを反転させて 長さ2バイト
  半角カタカナ 0x8E+該当コード 長さ2バイト
  JIS補助漢字  0x8F+MSB反転   長さ3バイト

EUC自体は日本語だけを扱うコードではなく、多国語に対応したものなので、EUCのこの新しい規格自体には長さ4バイトの文字まで使用できるようになっている。しかし現在の日本語EUCでは3バイトまでしか取り扱わない。

この改訂の結果EUCはますますいびつなものになってしまった。しかし1999年秋の時点で、JIS補助漢字を処理できているメジャーなコード体系は、EUCのみなのである。(ただし、まだこの新EUCで動いてるシステムは少なく、いまだにUNIXを基盤にしている人たちが「半角カタカナをインターネットで使うな」などと主張している)

新unicode

最初のunicodeは、多言語環境において、1バイトの文字と2バイトの文字が混在しており、更にその2バイトの文字が国によって異なった文字を表していた現状を憂い、英語の文字を含めた全ての文字を2バイトで統一的に扱い、全世界の文字を統一されたコードで表現しようとするプロジェクトであった。

しかしunicodeが定められた時のマシンの事情はこの統一コードを2バイト(16bit)で処理させざるを得なかったが、実際には世界中の文字をコード化しようとすると、とても2バイトでは足りないのである。

実際問題として、2バイトでは全部のコードを使ったとしても 65536文字までしか定義できないが、漢字は康煕字典に載っているものが47000文字。これに日本語の新字体や中国の簡体字、更には色々な俗字や、仏教などの特殊な分野のみで使用する文字を加えていくと、どう考えても数十万文字ある。こんなものを含めてコード化するためには、やはり4バイト欲しかった。

しかしそういう事情に熟知したメンバーがunicodeを定めるメンバーにいなかったか、或いはいて主張しても通らなかったのであろうか。また当時のマシン事情においては、1文字を統一的に4バイトで扱うのはメモリーなどの資源上困難であった。

そういうわけで、unicodeもver.2以降は「全ての文字を同じ桁数で表す」という理想が崩れてしまったのである。

現在、unicode2.0では、文字を次のように捉える。

 ●縦256個(区,row)、横256個(点,cell)の「面(plane)」というものを考える。1つの面に最大65536文字が定義できる。
 ●この面を256個集めたものを群(group)と呼ぶ。
 ●unicodeでは128個の群を使用する。(つまりunicodeは31ビット)

そして、基本的に文字は群番号・面番号・区番号・点番号という4バイトで表現されることになる。ただし、0群・0面だけは特別視して BMP (Basic Multi-lingal Plane) と呼び、先頭の 0.0. を省略して2バイトで書いてもよいとする。

つまり、新しいunicodeは2バイト又は4バイトのコード体系なのである。

さて、ここで問題。

このようにして、2バイトコードと4バイトコードが混在してしまった場合、またまた最初にANKと日本語コードの問題のところで言ったように、両者の区別がつかなくなってしまうという問題が起きる。

そこでunicode2.0ではこの問題を次のように解決している。

・当面unicodeの中で使って良いのは、群0.面0〜16(0x10) の17面のみとする。
・この内、面0のデータ(BMP)はそのまま2バイトで処理する。
・この時BMPの一部を空けておく。実際には 0xd800〜0xdbff, 0xdc00〜0xdfff の1024+1024文字を確保する。
・1〜16面の16x65536=1048576文字を上記確保したエリア2文字の1024x1024=1048576文字に埋め込む。

要するに、シフトJISと似たようなことを、4バイト→2バイトの埋め込みに使用する訳である。これによって、2バイトのunicodeと4バイトのunicodeが混在しても構わないようになる。

このシフト方法をUTF−16と呼び、BMP上に確保した領域をサロゲート・ペアと呼んでいる。

なお、現在のBMPの確保状況は次のようになっている。

区番号 00〜FF
00 256 Latin-1互換(ASCII互換) Alphabet
01〜33 13056 その他各種アルファベット・かな・ハングル部品など
34〜4D 6656 (完成型ハングルが定義されていたが移動して空)
4E〜9F 20992 漢字(CJK統合.約21000文字) Ideograph
A0〜AB 3072 reserved Open
AC〜D7 11264 完成型ハングル
D8〜DB 1024 上位サロゲート
DC〜DF 1024 下位サロゲート
E0〜F8 6400 私用予約領域 Restricted
F9〜FF 1790 互換用文字(半角カタカナ,全角英数字など)

(2001.5.1)

(C)copyright ffortune.net 1995-2016 produced by ffortune and Lumi.
お問い合わせはこちらから