libiconv-1.9.1 に以下の修正を施すパッチです。
libiconv-1.9.1-ja-patch-1.diff.gz
$ tar zxvf libiconv-1.9.1.tar.gz $ zcat libiconv-1.9.1-ja-patch-1.diff.gz | patch -p0
$ cd libiconv-1.9.1 $ ./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)' EUC-JP-MS EUCJP-MS EUCJP-OPEN EUCJP-WIN CP932 SJIS-OPEN SJIS-WIN WINDOWS-31J CSWINDOWS31J $
次の文字の 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 |
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" ); といった変換で表1-2 にある文字が変換出来なくなります。
iconv() では、Unicode 経由でエンコーディングの変換をする為、JIS 漢字と Unicode の対応が一致しているコンバーターで変換をするのが望ましい為、RFC1468(ISO-2022-JP) 符号化方式に関しても JIS漢字と Unicode の対応付けが MS 方式になっている iso-2022-jp-ms (例) コンバーターを追加する必要があると思われます。
符号化方式 | JIS漢字 と Unicode の対応付け | |
---|---|---|
JIS方式 | MS方式 | |
シフトJIS | Shift_JIS | cp932 |
日本語EUC | EUC-JP | eucJP-ms |
RFC1468 | ISO-2022-JP | なし |
このパッチにより、マイクロソフトの Windows と同様の文字解釈による変換を行う cp932 もしくは eucJP-ms を iconv() の fromcode に指定した場合は、tocode に指定できるエンコーディングが次のように限定されます。
fromcode | → | tocode |
---|---|---|
cp932 | → | cp932 |
cp932 | → | eucJP-ms |
cp932 | → | utf-*,ucs-* |
eucJP-ms | → | cp932 |
eucJP-ms | → | eucJP-ms |
eucJP-ms | → | utf-*,ucs-* |
※iconv_open() の引数の順番は、第1引数が tocode, 第2引数が fromcode である事に注意
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 の全文字を正しく Unicode との間で変換する必要がある場合は、iconv() の指定に EUC-JP を使うようにしてください。
(+) が付いているファイルが追加ファイル
NEWS | 本パッチによる追加修正内容を追加 |
README | EUCJP-MS を追加 |
lib/aliases.h | make -f 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: SJIS-OPEN SJIS-WIN WINDOWS-31J CSWINDOWS31J。EUCJP-MS: EUC-JP-MS EUCJP-OPEN EUCJP-WIN |
lib/euc_jp.h | ユーザー定義文字の変換を削除 |
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 | make -f Makefile.devel で lib/genflags が生成 |
lib/jisx0201.h | 0x5C, 0x7E をそれぞれ、U+005C, U+007E に対応付けするように修正。 |
lib/jisx0208.h | JIS X 0208 1区29点 EM DASH を U+2014 EM DASH に対応付けするように修正。tools/Makefile でマッピングテーブルを書き換えて cjk_to_tab_h を実行して生成。 |
lib/jisx0213.h | JIS X 0213 1面1区29点 EM DASH を U+2014 EM DASH に対応付けするように修正。tools/JISX0213.TXT を修正して cjk_to_tab_h を実行して生成。 |
lib/shift_jisx0213.h | JIS X 0201 ラテン文字の 0x5C, 0x7E をそれぞれ、U+005C, U+007E に対応付けするように修正。 |
lib/sjis.h | ユーザー定義文字の変換を削除 |
man/iconv_open.3 | EUCJP-MS を追加 |
man/iconv_open.3.html | make -f Makefile.devel で生成 |
tests/CP932.IRREVERSIBLE.TXT | cp932の修正に伴い修正(make check 用の変換表) |
tests/CP932.TXT | cp932の修正に伴い修正(make check 用の変換表) Unicodeコンソーシアムにある CP932.TXT がそのまま使われているわけでは無いので注意が必要です。 |
tests/DEC-KANJI.TXT | lib/jisx0208.h の修正に伴い修正(make check 用の変換表) |
tests/EUC-JISX0213.TXT | lib/jisx0213.h の修正に伴い修正(make check 用の変換表) |
tests/EUC-JP.TXT | lib/jisx0208.h の修正に伴い修正(make check 用の変換表) |
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/ISO-2022-JP-3-snippet.UTF-8 | lib/jisx0208.h の修正に伴い修正(make check 用の変換表) |
tests/JIS_X0201.TXT | lib/jisx0201.h の修正に伴い修正(make check 用の変換表) |
tests/Makefile.in | eucJP-msのテストを追加 |
tests/Makefile.mscv | eucJP-msのテストを追加 |
tests/Makefile.os2 | eucJP-msのテストを追加 |
tests/SHIFT_JIS.TXT | lib/{jisx0201.h,jisx0208.h,sjis.h} の修正に伴い修正(make check 用の変換表) |
tests/SHIFT_JISX0213.TXT | lib/shift_jisx0213.h の修正に伴い修正(make check 用の変換表) |
tools/JISX0213.TXT | JIS X 0213 1面1区29点 EM DASH を U+2014 EM DASH に対応付けするように修正 (cjk_to_tab_h 用) |
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を生成可能なように修正 |