OSX Lion で iconv を使って WINDOWS-31J のデータを扱いたい
とある用途で Ruby の Mechanize を使う事になったわけですが、Mechanize は内部で Iconv を使用してエンコーディング変換を行っています。
なので、WINDOWS-31J なページを扱おうとした場合に、iconv が WINDOWS-31J に対応していないと困ってしまうわけです(例外終了してしまう)。
そして、OSX Lion 組み込みの iconv は WINDOWS-31J という名前のエンコーディング(エイリアス)はサポートしていない様です。
どう対応するのが良いのか分からなかったので、とりあえず rvm のパスにパッチを当ててコンパイルした iconv をインストールしてみました。
- http://www.gnu.org/software/libiconv/
- http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.13-ja-patch.html
$ curl -s http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz | gzip -dc | tar xvf - $ cd libiconv-1.13 $ curl -s https://trac.macports.org/export/89276/trunk/dports/textproc/libiconv/files/patch-Makefile.devel | patch -p1 $ curl -s https://trac.macports.org/export/89276/trunk/dports/textproc/libiconv/files/patch-utf8mac.diff | patch -p1 $ cat <<EOF | patch -p1 diff --git a/lib/flags.h b/lib/flags.h index d7cda21..4cabcac 100644 --- a/lib/flags.h +++ b/lib/flags.h @@ -14,6 +14,7 @@ #define ei_ascii_oflags (0) #define ei_utf8_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) +#define ei_utf8mac_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2be_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) #define ei_ucs2le_oflags (HAVE_ACCENTS | HAVE_QUOTATION_MARKS | HAVE_HANGUL_JAMO) EOF $ curl -s http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-ja-1.patch.gz | gzip -dc | patch -p1 $ ./configure --enable-extra-encodings --prefix=$rvm_path/usr $ make -f Makefile.devel $ make check $ make install $ rvm reinstall 1.8.7-p174 --with-iconv-dir=$rvm_path/usr $ $rvm_path/usr/bin/iconv -l | grep -i windows-31j CP932 MS932 SHIFT_JIS-MS SJIS-MS SJIS-OPEN SJIS-WIN WINDOWS-31J WINDOWS-932 CSWINDOWS31J $ ruby -riconv -e 'puts Iconv.conv("Windows-31J", "UTF-8", [ 0x301C ].pack( "U*" ))' | nkf -Sw 〜
使えているように見えなくもない。