日本語文字コードのお話
レガシーエンコーディングプロジェクトというのをやっていて昨日その検収があった。
開発そのものは一段落したのだが、まだ、事務処理が残っているので、全て完了というわけではない。
プロジェクトの背景として、Unicodeによるオープンソースソフトウェアの国際化が普及した結果として、日本語処理にいろいろな問題(文字化け)が発生したというのがある。奇妙に聞こえるかもしれない。Unicodeというのはソフトウェアの国際化のためにやっているのではないか?ソフトウェアが国際化すれば文字化けは解消するのではないか?話が逆じゃないのか?という疑問があるだろう。ところがだ、Unicodeによって解決した問題ももちろんあるがそれによって生じた問題もある。
例えば、日本語を表現する文字のエンコーディングとして、シフトJIS、日本語EUC、JISコードなど複数あるが、それぞれのコード変換で文字化けする場合がある。あるいは〜のような文字が文字コード変換で文字化けする。機種依存文字(まる一)が変換できない。
これらは、Unicodeを中心とした変換テーブルを使っているが故に発生する。例えばシフトJISから日本語EUCへの変換は、まづシフトJISのコードをUnicodeに変換し、その後、日本語EUCへ変換する。そうするとシフトJISで未定義の文字はUnicodeに変換できないし、日本語EUCで未定義な文字も変換できない。機種依存文字は日本語EUCで定義されていないので変換できないのである。
一方、シフトJISと日本語EUCのエンコーディング(ビットの組み合わせ)は機械的なアルゴリズムによって変換できるので、そのようなアルゴリズムを利用して変換している場合は情報の損失なく変換できる。
プロジェクトのWikiページに代表的なエンコーディングの対応関係を示すが、JIS X0208(漢字)の1区1点から94区94点の文字については各エンコーディング毎にマッピングは可能である。
JIS X0208の85区〜94区は、まるまる空領域(文字が定義されていない)のだが、マイクロソフトが定義したシフトJIS(CP932)では89区から92区にNEC選定IBM拡張文字というのが定義されている。
Unicodeを利用したマッピングだと、シフトJISからUnicodeへの変換はできるが、日本語EUC側に対応する文字がないので変換できない。これがアルゴリズムでシフトJISの85区1点を日本語EUCの85区1点に、85区2点を同様に85区2点へと変換していけば、コードの場所そのものは保存されるので、シフトJISから日本語EUCへ双方向で変換できる。従来の(太古の)ソフトウェアはそのようにして日本語のエンコーディングに対応していた。従ってある区点番号に文字が定義されていようがいまいが、その区点番号そのもので相互変換できたので、例え日本語EUCで文字が表示できなかったとしても再度シフトJISへ変換しなおせばデータは復活できたのである。ところが、Unicodeを利用したマッピングだと未定義な文字なので、どうころんでも一度変換に失敗すると復活させるすべがない。
この問題に対する解の一つは、日本語だけを特別あつかいをして、シフトJISと日本語EUCの変換アルゴリズムをソフトウェアに埋め込むというものがあるが、文字コードの種類(N)が増えてきたらN*(N-1)組の変換アルゴリズムを実装しなければならなくなって現実的とは言えない。(昔はごりごり、そーゆープログラムを書いていたのだけど)
もう一つの解は、シフトJISの文字種に対応した日本語EUCを定義してしまう事である。すなわち、機種依存文字とよばれるものNEC特殊文字(13区)、NEC選定IBM拡張文字を89区から92区に配置してしまうのである。これらの文字集合はeucJP-msとして知られていて、オープングループの日本ベンダ協議会が定義した。
今回のレガシーエンコーディングプロジェクトでは、eucJP-ms以外に、cp932、ISO-2022-JP-MSとCP51932を9つのOSS(libiconv/glibc/Perl/Ruby/Python/PHP/PostgreSQL/MySQL/nkf)について実装した。
文字化けのように昔から良く知られていて皆が解決が必要だと思っている問題でもよく見てみるとまだまだ整備されていないというものはOSSでも少なからづあるという事である。こーゆー問題を一歩一歩地味だけど着実に解決していくことがOSSの価値を高める事になるのである。
リンク:
Legacy Encoding Project Wiki
http://legacy-encoding.sourceforge.jp/wiki/
Sourceforege Project
http://sourceforge.jp/projects/legacy-encoding
日記など:
http://d.hatena.ne.jp/hyoshiok/20060316#p1
謝辞:
本プロジェクトはIPA (情報処理推進機構) の 2005年度下期 オープンソースソフトウェア活用基盤整備事業 で「オープンソースソフトウェアにおける統一したレガシーエンコーディングの変換機能の開発」として採択され支援を受けた。





最近のコメント