libiconv-1.8-cp932-patch.diff.gz

概要

libiconv-1.8 でサポートされている cp932 の変換は、マイクロソフトの変換と異なり Windows とのデータ交換に支障が生じる為、マイクロソフトの変換と一致するように修正を加えました。

また、cp932 と EUC-JP の相互変換では、いわゆる 機種依存文字が EUC-JP に変換できないので、TOG/JVC CDE/Motif 技術検討 WG が策定した eucJP-ms の変換を libiconv に追加・実装しました。

これにより、cp932 の全文字を eucJP-ms (eucJP-open) との間で相互変換できるようになります。

Samba 3.0 のように文字コード変換に iconv() を使い、サーバー上のファイル名は、日本語EUCで保存したい場合などにも cp932 の全文字を正確に扱うことが可能となります。また、日本語を使えるようにした WebDAV (Apache + mod_dav + mod_encoding) などでも本パッチは有効と思われます。

ダウンロード

libiconv-1.8-cp932-patch.diff.gz

ご利用方法

パッチのあて方

$ gzip -dc libiconv-1.8.tar.gz | tar xvf -
$ cd libiconv-1.8
$ gzip -dc ../libiconv-1.8-cp932-patch.diff.gz | patch -p1

メイク&インストール

$ cd libiconv-1.8
$ ./configure
$ make ; make check
$ su
# make install

他に環境によっては /etc/ld.so.conf に /usr/local/lib を追加し ldconfig -v (/sbin/ldconfig -v) を実行しておく必要があるでしょう。

確認方法

$ iconv -l | egrep -i '(-31j|-ms)'
EUCJP-MS
CP932 WINDOWS-31J
$ 

詳細

cp932 の修正内容

  1. 次の文字の Unicode との対応を、libiconv 独自の変換から、マイクロソフトの変換にあわせて修正

    表1-1 修正前
    cp932 Unicode
    ¢0x8191U+00A2
    £0x8192U+00A3
    ¬0x81CAU+00AC
    0x817CU+2212
    0x8161U+2016
    0x8160U+301C
    表1-2 修正後
    cp932 Unicode
    ¢0x8191U+FFE0
    £0x8192U+FFE1
    ¬0x81CAU+FFE2
    0x817CU+FF0D
    0x8161U+2225
    0x8160U+FF5E

    iconv_open() の fromcode に "EUC-JP" などが指定され、tocode に "cp932" が指定された場合にも正しく変換が行えるように、修正前の Unicode → cp932 の変換は今までどおり残してあります。

  2. cp932(Windows-31J)で重複符号化されている文字の変換を、マイクロソフトの変換にあわせて修正

    変換の詳細は、次を参照

  3. IANAの登録名Windows-31Jをcp932のエイリアスとして追加

eucJP-ms について

cp932 の変換の修正により、iconv() を使って cp932 と EUC-JP 間の相互変換で、JIS X 0208 の文字が正しく相互変換できなくなる事と、EUCエンコーディングで cp932 の機種依存文字に対応させる為に、TOG日本ベンダ協議会CDE/Motif 技術検討 WG が作成した eucJP-ms の変換規則 を libiconv に実装しました。

eucJP-ms の変換については、次のページを作成しましたで、そちらをご覧ください。

cp932 修正による影響と対策

cp932 の変換を 表1-2 のように修正したため、そのままでは iconv( "iso-2022-jp", "cp932" ); といった変換で表にある文字が変換出来なくなってしまいます。

cp932 と EUC-JP との変換に関しては、EUC-JP の代わりに eucJP-ms を使う事で解決できますが、日本で代表的なエンコーディングである iso-2022-jp との変換が出来ないと実用上不便ですので、iso-2022-jp に限り Unicode → iso-2022-jp の変換で次のコードポイントの変換を加えるように修正いたしました。従来の変換は、そのままで今まで変換できなかった Unicode のコードポイントを Unicode → iso-2022-jp の片方向変換のみに限り追加しているので、この追加によって iso-2022-jp と他のエンコーディング間の変換に支障が出ることはないと思います。

表2 iso-2022-jp への追加
Unicodeiso-2022-jp
¢U+FFE0 0x2171
£U+FFE1 0x2172
¬U+FFE2 0x224C
U+FF0D 0x215D
U+2225 0x2142
U+FF5E 0x2141

制限事項

cp932/eucJP-ms の制限事項

このパッチにより、マイクロソフトの Windows と同様の文字解釈による変換を行う cp932 もしくは eucJP-ms を iconv() の fromcode に指定した場合は、tocode に指定できるエンコーディングが次のように限定されます。

fromcodetocode
cp932 cp932
cp932 eucJP-ms
cp932 iso-2022-jp
cp932 utf-*,ucs-*
eucJP-mscp932
eucJP-mseucJP-ms
eucJP-msiso-2022-jp
eucJP-msutf-*,ucs-*

※iconv_open() の引数の順番は、第1引数が tocode, 第2引数が fromcode である事に注意

これ以外のエンコーディングへの変換を行う場合は、fromcode には cp932, eucJP-ms の代わりに、それぞれ Shift_JIS, EUC-JP を使うようにしてください。

tocode に cp932 もしくは eucJP-ms を指定した場合に fromcode に指定できるエンコーディングは、tocode に、Shift_JIS もしくは EUC-JP を指定した時と同じ物が指定できます。ただし、fromcode に JIS X 0212 を含むエンコーディングを指定した場合には、cp932/eucJP-ms では、次のような変換が行われます。

JIS X 0212 区-点Unicode cp932eucJP-ms
2-23 (TILDE)U+FF5E (FULLWIDTH TILDE) 0x8160 (〜) 0xA1C1 (〜)
2-81 (NUMERO SIGN)U+2116 (NUMERO SIGN)0x8782 (No.) 0xADE2 (No.)

eucJP-ms の制限事項

JIS X 0212 の 2区23点と2区81点 が Unicode との相互変換で別のコードポイントに変換されます。

JIS X 0212 区-点eucJP-msUnicodeeucJP-ms
2-23 (TILDE)0x8FA2B7U+FF5E (FULLWIDTH TILDE)0xA1C1 (〜)
2-81 (NUMERO SIGN)0x8FA2F1U+2116 (NUMERO SIGN)0xADE2 (No.)

この制限は、cp932 との相互変換を優先させた結果、生じた制限です。JIS X 0212 の全文字を正しく変換する必要がある場合は、iconv() の指定に EUC-JP を使うようにしてください。

追加・修正ファイル一覧

(+) が付いているファイルが追加ファイル

lib/aliases.gperfeucJP-msとWindows-31Jの追加
lib/aliases.hMakefile.develでlib/aliases.gperfから生成。別途 gperf の入手が必要
lib/converters.heucjp_ms.hのインクルードを追加
lib/cp932.h1区〜2区も cp932ext_mbtowc() を呼び出すように変更
lib/cp932ext.htoolsディレクトリで make cp932ext.h として生成。 Unicodeコンソーシアムのサイトにある CP932.TXT の入手と tools/Makefile のTABLESDIRの修正が必要。 tools/Makefile を修正せず cjk_tab_to_h を直接実行しても良い
lib/encodings.defeucJP-msの追加と、cp932のエイリアスにWindows-31J を追加
lib/eucjp_ms.h (+)eucJP-msの変換(euc_jp.hをコピーして処理を追加)
lib/eucjp_msext.h (+)toolsディレクトリで make eucjp_msext.h で生成。 TOG/JVC の eucjp-ibmext.txt の入手とMakefileのTABLESDIRの 修正が必要。 Makefileを修正せずcjk_tab_to_hを直接実行しても良い
lib/flags.hMakefile.develで生成
lib/iso2022_jp.hcp932/eucJP-msをiconvのfromに指定した時に変換 が出来るように修正
tests/CP932.IRREVERSIBLE.TXTcp932の修正に伴い修正(make check 用の変換表)
tests/CP932.TXTcp932の修正に伴い修正(make check 用の変換表) Unicodeコンソーシアムにある CP932.TXT がそのまま使われているわけでは無いので注意が必要です。
tests/EUCJP-MS.IRREVERSIBLE.TXT (+)roundtripできない文字の表(make check 用の変換表)
tests/EUCJP-MS.TXT (+)TOG/JVC の表 ( eucJP-0201A.txt, eucJP-0208M.txt, eucJP-0212M.txt, eucJP-13th.txt, eucJP-udc.txt, eucJP-ibmext.txt ) と 0x00〜0x1F の表を結合し sort
tests/Makefile.ineucJP-msのテストを追加
tools/Makefileeucjp_msext.hの生成規則を追加。 make all ではeucjp_msext.hは生成されないように all の規則ではeucjp_msext.hはコメントアウトしてあります。(変換表の入手が必要な為)
tools/cjk_tab_to_h.ccp932ext.h(修正版),eucjp_msext.hを生成可能なように修正

変更履歴

2002年11月2日
新規作成(公開)
2002年11月11日
追加修正 : 制限事項に tocode に cp932/eucJP-ms を指定した場合に、fromcode に指定できるエンコーディングの説明を追加。
2005年10月3日
パッチの当て方を修正