| No.344 | 投稿日時: | 2005/11/09(水) 01:08 <↑親記事:No.343> |
| 投稿者: | 森山将之 |
glibc(GNU libc), libiconv の iconv(3) の処理では、マルチバイトエンコーディングとして有効なバイト列であっても、文字が定義されていないコードポイントに出会うと、EILSEQエラーとなってしまいます。
iconv(3)を呼び出したプログラムでは、エラーとなったバイト列が、何バイトコードなのか不明なため、一般的には最初の1バイトを ? などに変換してから次のバイトから変換処理を継続するなどしているようです。
このような処理ですと、文字境界がズレてしまうため、以降の文字が文字化けしてしまう危険があり、個人的にも問題だと思っています。
根本的な解決ではありませんが、Windows独自定義の文字であれば CP51932 もしくは eucJP-ms から UTF-8 に変換する事で、エラーなしに変換できるようになります。
iconv(3) で、CP51932 や eucJP-ms の変換をするには、libiconv に次のパッチを適用して使うようにしてください。
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.10-ja-patch.html
EUCエンコーディングで、JISで未定義の文字が使われているようですが、どのようにしてそのようなデータが生成されたのか不明なので、CP51932 と eucJP-ms のどちらで変換すれば良いのかわからないのですが、EUC-JP->UTF-8 変換でエラーになる文字の先頭のバイトが、0x8F であれば、eucJP-ms で変換できると思います。0x8F 以外であれば、CP51932 で変換してみてください。