Ngraph for X11で中国語、韓国語フォントを扱う [ Ngraph for X11 6.3.30用 cjk patch (experimental) ] 2005.04.02 田中(KXD02663(at)nifty(dot)ne(dot)jp) [ 1 ] 概要 Ngraph for X11で中国語、韓国語フォントを扱えるようにする話題です。 まず、オリジナルのパッチを当てないまま扱える範囲を述べ、 次に、扱える範囲を拡張したパッチを紹介します。 まだ実験段階ですが、一通りのことはできています。 [ 2 ] はじめに オリジナルのNgraph(Ver.6.3.30)は英数字と日本語のフォントが使用でき、 Unix/Linux系ではEUC-JP, WindowsではShift_JISの環境で動作します。 Ngraph for X11ではWindows版との互換性への配慮から EUC-JPとShift_JISの間のコード変換を随所で行っています。 この日本語用の特殊な処理のため、 Ngraphで中国語や韓国語を扱いたくても フォントを交換するだけで済まない部分があります。 しかし、日中韓の文字コードは互いに似ている部分も多く、 Ngraphで各文字を扱うまでの障壁は、意外に高くありません。 日中韓の文字コードは大別するとEUC(Extended UNIX Code)系と 非EUC系に分けられます。 前者は国際規格ISO2022に準拠したもので、主にUnixで使われてきました。 後者はEUCより拡張したコードの範囲[注1]を使用しており、 Windows, Machintoshなど主にPCで使われてきました。 日本語の場合は前者がEUC-JP, 後者がShift_JISに相当し 相互運用にはコード変換が必要ですが、 中国語簡体字(GB2312とGBK), 韓国語(KS C 5601とUHC(unified hangul code))の 場合は後者が前者の上位互換になっているそうです[参考1]。 さらに、最近のUnix/Linuxの国際化(i18n)機構[参考2]では、 地域の環境(ロケール locale)の言語環境として従来のEUCに加えて 非EUCの文字コード(Shift_JIS, GBK, Big5, UHC等)を選択できるようになっています。 したがって、UnixとPCの相互運用を考えた場合、 適切な文字コードを選べば、日本語よりもむしろ簡単に運用できそうです。 EUC系はいずれも構造がそっくりなので、一部制限はあるものの、 日本語EUCを各国語EUCに変更するだけでオリジナルのまま一通り動作します。 今回さらに、Xの環境が非EUC系の場合でも動作するようにするため、 文字コード関連の処理を変更するパッチを作成しました。 これにより、非EUC系のUnix環境(Shift_JIS, GBK, Big5, UHC等)のもとでも 日中韓の2バイト文字コードが扱えるようになります。 [ 3 ] オリジナルでできること・できないこと Ngraphは日本語の文字集合としてJIS X 0208を対象としています。 日本語の文字集合(JIS X 0208)のエンコーディング方法として、 JISエンコーディング(JIS)、 Shift_JISエンコーディング(SJIS)、 EUCエンコーディング(EUC)の3種類があり[注2]、 これらは互いに1対1の変換が可能であり、 Ngraph内部では次のように場面場面で使い分けられています。 ◇ オリジナルのエンコーディング GUI: − 入出力 EUCを仮定 (実際はロケールに依存) − 描画 直前にJISへ変換 ngpファイル名 ロケールに依存 (EUCを想定) ngpファイル内(Ngraph object): − "text::text="以降(※) SJIS − "file::file="以降 ロケールに依存 (EUCを想定) − "merge::file="以降 ロケールに依存 (EUCを想定) graファイル名 ロケールに依存 (EUCを想定) graファイル内: − 'K'以降(※) SJIS ※以下、レジェンド文字列と呼ぶ 日中韓各国のEUCはISO2022の規格に則っており構造が実によく似ています。 そのため、フォントの設定さえすれば、 以下のロケールのもとで対応している文字集合は使用可能です。 文字 文字集合 eucの名称 localeの例 日本語 JIS X 0208 EUC-JP ja_JP.eucjp 中文簡体字 GB2312 EUC-CN zh_CN.gb2312 中文繁體字 CNS11643-1 EUC-TW zh_TW.euctw ハングル KS C 5601 EUC-KR ko_KR.euckr オリジナルのまま使えるのは大きなメリットですが、 次の制限や問題点があります。 (1) 各文字集合の第1面(94×94字)までが使える。 JIS補助漢字, JIS X 0213やCNSのように多数の面があっても第2面以降は使えない。 GBK, UHC等で拡張された部分は使えない。ISO2022規格外のBig5は使えない。 (2) レジェンド文字列はShift_JISと同等のエンコーディングとなる。 いわば、Shift_GB, Shift_CNSやShift_KSとなってしまう。 規格外のエンコーディングなので 通常のテキストエディターで読んだり編集したりできない。 (3) レジェンド文字列がWindows等で普及している各国語コード(GBK, Big5, UHC)と は別物になってしまう。Windowsとの相互運用は困難。 (4) 各国語EUCが必ずしも普及しているといえない。 ということで、利用するのは、 「各国語EUCを利用している環境で94×94字の制限に満足し 最終出力がgra2psによるPostScriptファイル」、 という状況に限られそうです。 [ 4 ] CJKパッチ 本CJKパッチでは、非EUC系のGBK, Big5, UHCなどの中国語、韓国語も 扱えるようにするため、 コード判定とコード変換の箇所を変更し、以下のようにします。 ◇ 本CJKパッチ後のエンコーディング GUI: − 入出力 ロケールに依存 − 描画 直前にSJIS→JIS変換, EUC→JIS変換, 無変換のどれか ngpファイル名 ロケールに依存 ngpファイル内(Ngraph object): − "text::text="以降 ロケールに依存 − "file::file="以降 ロケールに依存 − "merge::file="以降 ロケールに依存 graファイル名 ロケールに依存 graファイル内: − 'K'以降 ロケールに依存 [ 5 ] 扱えるようになるフォント GUIではXやMotifの国際化(i18n)機構に依存しているため、 GUIでの操作のためにはロケールとフォントが一致している必要があります。 扱える対象はEUC系からさらに広がります。 レジェンド文字列に利用可能な文字集合、エンコーディングやフォントの条件は 以下の通りです。 (1) 第1バイトが0x81〜0xffかつ第2バイトに0x00を含まない、 8ビット2バイトのエンコーディング (2) 最上位ビットの有無など簡単なコード変換で(1)と対応づけられる 8ビット2バイトのフォント (3) ロケールと対応関係にある つまり、非EUC系のロケール(Shift_JIS, GBK, Big5, UHC等)のもとでも 各ロケールが対応する2バイト文字コードが扱えるようになります。 Vine Linux 3.1と一部RedHat Linux8.0の付属フォントを用い、 以下の環境で動作確認しました。 文字 文字集合 encoding locale Xのフォント 日本語 JIS X 0208 EUC-JP ja_JP.eucjp *-jisx0208.1983-0 中文簡体字 GB2312 EUC-CN zh_CN.gb2312 *-gb2312.1980-0 中文簡体字 GBK GBK zh_CN.gbk *-gbk-0 中文繁體字 Big5 Big5 zh_TW.big5 *-big5-0 ハングル KS C 5601 EUC-KR ko_KR.euckr *-ksc5601.1987-0 [ 6 ] インストール パッチを当て、Makefileを編集し DEFS = -DJAPANESE を DEFS = -DCJK と書き直してmakeし、 各設定ファイルNgraph.ini, gra2wmf.ini, gra2ps.iniや リソースファイルNgraphを適当に編集してください。 リソースファイルの例を zh_gb/Ngraph, zh_gbk/Ngraph, zh_big5/Ngraph, ko/Ngraphに入れてあります。 Ngraph.ini内でのfont_mapの3番目のパラメーターは、 仕様を拡張しており、Xでの描画前のコード変換を指定できます。 0:欧文1バイト, 1:SJIS→JIS変換, 2:EUC→JIS変換, 3:無変換 です。 1:SJIS→JIS変換では、SJISエンコーディングからJISエンコーディングに変換、 2:EUC→JIS変換では、最上位ビットを0にしたコード値に変換し、 3:無変換では、そのままのコード値のままにします。 gra2wmf.iniでは、 文字コードとして、従来のansi, shiftjisに加えて、 chinesebig5, gb2312, hanguelでも動作するようになります。 しかし、文字の大きさはいい加減です。 本来なら、SimSun, MingLiU, Batangなどの文字の大きさを把握して 反映させるべきなのでしょうが、そこまで手を掛けていません。 gra2ps.iniでは、 sjisのパラメータとして、 従来の0:SJIS→EUC変換, 1:無変換に加え、2:EUC→JIS変換も可能としました。 フォントごとに、この動作の切り替えをできるようにすることは可能でしょうが、 そこまで手を掛けていません。 フォントのエイリアス名は適当に追加しました。 x11drive/gra2wmf.c, x11drive/gra2ps.cなどをご参照下さい。 動作確認に使ったサンプルファイルを x11demo/science1.ngp, x11demo/science2.ngpに入れました。 [ 7 ] 制限事項、問題点など レジェンド文字列は各ロケールに依存したエンコーディングになります。 オリジナルのNgraphではShift_JISに限定している点を勝手に変更・拡張しており、 オリジナルのNgraphやWindows版との互換性、相互運用性はありません。 Windowsに近いエンコーディング(例: Shift_JIS, GBK, Big5やEUC-KR)のロケールでは、 gra2wmfによりWindowsで読めるwmfファイルが作成可能です。 その一方、Windowsと互換性の乏しいロケール(例: EUC-JPやCNS)では、 Windowsとの相互運用性に困難が生じます。 (EUC-JPについてはad hocなEUC→Shift_JIS変換機能をgra2wmfに追加しました。) 日本語EUC(EUC-JP)ロケールのもとで使用すると、 2バイト文字としてはEUC-JPが内部コードにも使われることになり、 オリジナルにあるShift_JISとの変換機能は働きません。 GUIでは、XやMotifの国際化(i18n)機構に依存しているため、 多言語化(m17n)ではありません。 つまり、多言語を同時にGUIで扱うことは出来ません。 (表示させるだけなら可能ですが)。 言語の切り替えにはロケールの切り替えが必要です。 オリジナルとはmake時に作り分けることになります。 設定により動作を切り替えられるようにすることも可能だとは思いますが、 そこまで手を掛けていません。 Unicodeには対応していません。 やるとするならASCIIと混ぜ書きの可能なUTF-8Nが最有力でしょうが、 8ビット3バイト可変長を扱えるように改造する必要があります。 2バイト文字コードの判定は、オリジナルよりゆるくなっています。 このため、Shift_JISを扱うロケールで使用すると、 レジェンド文字列に1バイトカタカナの入力が混入した場合に 文字化けがオリジナルより悪化します。 [ 6 ] 動作確認 以下の環境で動作確認しました。 Vine Linux 3.1 openMotif-2.2.3 Ngraph for X11 Ver.6.3.30 gcc version 2.95.3 20010315 (gcc version 3.3.2 20031218の場合は、gra2wmfをコンパイルする際 最適化オプションを-O2ではなく-O1以下でコンパイルしないと異常になる) GNU Ghostscript 7.07 (2003-05-17) [ 7 ] 使用条件と配布条件 大したことはやっていません。 著作権を主張しませんのでご自由にどうぞ。 [ 8 ] 変更履歴 Ver.0.00 2004.04.02 初公開版 2004.05.21 動作確認の項を修正 [注1] 日中韓の文字コードは大別するとEUC系と非EUC系に分けられます。 前者は国際規格ISO2022に準拠した文字集合を扱います。 これらは94区×94点×n面の配置をしており、 EUCでは第1面の文字はGRに呼び出した状態のまま使います。 このとき第1バイトが0xa1〜0xfe, 第2バイトが0xa1〜0xfe になります。 後者は、 多くの場合94×94字より大幅に拡張した領域を使用しますが、 もっとも範囲の広いものでも大抵 第1バイトが0x81〜0xff, 第2バイトが0x31〜0xffの範囲に収まっています。 EUC系、非EUC系のどちらも8ビット2バイトを越えた 多バイトコードを定義している場合がありますが、ここでは扱いません。 [注2] ここでいうJISエンコーディングとは、 「JIS X 0208をGLに呼び出した状態でのビット組み合わせ」のことです。 呼び出しのためのエスケープシーケンスは含まれません。 EUCエンコーディングとは、 「JIS X 0208をGRに呼び出した状態でのビット組み合わせ」のことです。 [参考1] 日中韓の文字コードに関する解説 文字コードの世界 安岡孝一、安岡素子 東京電機大学出版局 ISBN4-501-53060-X http://www.kudpc.kyoto-u.ac.jp/~yasuoka/index-j.html 東アジアの文字集合の概要: 中国語 (益山さん) http://www.asahi-net.or.jp/~ez3k-msym/charsets/cjk-c.htm 東アジアの文字集合の概要: 日本語 http://www.asahi-net.or.jp/~ez3k-msym/charsets/cjk-j.htm 東アジアの文字集合の概要: 韓国語 http://www.asahi-net.or.jp/~ez3k-msym/charsets/cjk-k.htm 文字コードの話 (伊藤さん) http://www.euc.jp/i18n/charcode.ja.html 文字コードの話 (大阪外語大学) http://mlang1.osaka-gaidai.ac.jp/~tagengo/multi/char_code.html これによると、 各国語Windowsの文字コードは、 CP932 日本語 (Shift-JIS) CP936 中国語簡体字 (GBK) CP950 中國語繁軆字 (拡張 Big5) CP949 韓国語 (UHC) [参考2] Solaris OS は、EUCエンコーディング以外にも Shift_JIS, Big5, GBKのような非EUCエンコーディングに対応しており、 「CSI対応(Codeset Independence support)」と呼んでいます。 国際化機能はロケール切り替えにより作動します。 国際化対応言語環境の利用ガイド http://docs.sun.com/app/docs/doc/819-0400?l=ja