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 $
次の文字の Unicode との対応を、libiconv 独自の変換から、マイクロソフトの変換にあわせて修正
cp932 | ⇔ | Unicode | |
---|---|---|---|
¢ | 0x8191 | ⇔ | U+00A2 |
£ | 0x8192 | ⇔ | U+00A3 |
¬ | 0x81CA | ⇔ | U+00AC |
− | 0x817C | ⇔ | U+2212 |
‖ | 0x8161 | ⇔ | U+2016 |
〜 | 0x8160 | ⇔ | U+301C |
cp932 | ⇔ | Unicode | |
---|---|---|---|
¢ | 0x8191 | ⇔ | U+FFE0 |
£ | 0x8192 | ⇔ | U+FFE1 |
¬ | 0x81CA | ⇔ | U+FFE2 |
− | 0x817C | ⇔ | U+FF0D |
‖ | 0x8161 | ⇔ | U+2225 |
〜 | 0x8160 | ⇔ | U+FF5E |
iconv_open() の fromcode に "EUC-JP" などが指定され、tocode に "cp932" が指定された場合にも正しく変換が行えるように、修正前の Unicode → cp932 の変換は今までどおり残してあります。
cp932(Windows-31J)で重複符号化されている文字の変換を、マイクロソフトの変換にあわせて修正
変換の詳細は、次を参照
IANAの登録名Windows-31Jをcp932のエイリアスとして追加
cp932 の変換の修正により、iconv() を使って cp932 と EUC-JP 間の相互変換で、JIS X 0208 の文字が正しく相互変換できなくなる事と、EUCエンコーディングで cp932 の機種依存文字に対応させる為に、TOG日本ベンダ協議会 の CDE/Motif 技術検討 WG が作成した eucJP-ms の変換規則 を libiconv に実装しました。
eucJP-ms の変換については、次のページを作成しましたで、そちらをご覧ください。
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 と他のエンコーディング間の変換に支障が出ることはないと思います。
Unicode | → | iso-2022-jp | |
---|---|---|---|
¢ | U+FFE0 | → | 0x2171 |
£ | U+FFE1 | → | 0x2172 |
¬ | U+FFE2 | → | 0x224C |
− | U+FF0D | → | 0x215D |
‖ | U+2225 | → | 0x2142 |
〜 | U+FF5E | → | 0x2141 |
このパッチにより、マイクロソフトの Windows と同様の文字解釈による変換を行う cp932 もしくは eucJP-ms を iconv() の fromcode に指定した場合は、tocode に指定できるエンコーディングが次のように限定されます。
fromcode | → | tocode |
---|---|---|
cp932 | → | cp932 |
cp932 | → | eucJP-ms |
cp932 | → | iso-2022-jp |
cp932 | → | utf-*,ucs-* |
eucJP-ms | → | cp932 |
eucJP-ms | → | eucJP-ms |
eucJP-ms | → | iso-2022-jp |
eucJP-ms | → | utf-*,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 | → | cp932 | eucJP-ms |
---|---|---|---|---|
2-23 (TILDE) | U+FF5E (FULLWIDTH TILDE) | → | 0x8160 (〜) | 0xA1C1 (〜) |
2-81 (NUMERO SIGN) | U+2116 (NUMERO SIGN) | → | 0x8782 (No.) | 0xADE2 (No.) |
JIS X 0212 の 2区23点と2区81点 が Unicode との相互変換で別のコードポイントに変換されます。
JIS X 0212 区-点 | eucJP-ms | → | Unicode | → | eucJP-ms |
---|---|---|---|---|---|
2-23 (TILDE) | 0x8FA2B7 | → | U+FF5E (FULLWIDTH TILDE) | → | 0xA1C1 (〜) |
2-81 (NUMERO SIGN) | 0x8FA2F1 | → | U+2116 (NUMERO SIGN) | → | 0xADE2 (No.) |
この制限は、cp932 との相互変換を優先させた結果、生じた制限です。JIS X 0212 の全文字を正しく変換する必要がある場合は、iconv() の指定に EUC-JP を使うようにしてください。
(+) が付いているファイルが追加ファイル
lib/aliases.gperf | eucJP-msとWindows-31Jの追加 |
lib/aliases.h | Makefile.develでlib/aliases.gperfから生成。別途 gperf の入手が必要 |
lib/converters.h | eucjp_ms.hのインクルードを追加 |
lib/cp932.h | 1区〜2区も cp932ext_mbtowc() を呼び出すように変更 |
lib/cp932ext.h | toolsディレクトリで make cp932ext.h として生成。 Unicodeコンソーシアムのサイトにある CP932.TXT の入手と tools/Makefile のTABLESDIRの修正が必要。 tools/Makefile を修正せず cjk_tab_to_h を直接実行しても良い |
lib/encodings.def | eucJP-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.h | Makefile.develで生成 |
lib/iso2022_jp.h | cp932/eucJP-msをiconvのfromに指定した時に変換 が出来るように修正 |
tests/CP932.IRREVERSIBLE.TXT | cp932の修正に伴い修正(make check 用の変換表) |
tests/CP932.TXT | cp932の修正に伴い修正(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.in | eucJP-msのテストを追加 |
tools/Makefile | eucjp_msext.hの生成規則を追加。 make all ではeucjp_msext.hは生成されないように all の規則ではeucjp_msext.hはコメントアウトしてあります。(変換表の入手が必要な為) |
tools/cjk_tab_to_h.c | cp932ext.h(修正版),eucjp_msext.hを生成可能なように修正 |