こしごぇ(B)

旧:http://d.hatena.ne.jp/koshigoeb/

OSX Lion で iconv を使って WINDOWS-31J のデータを扱いたい

とある用途で Ruby の Mechanize を使う事になったわけですが、Mechanize は内部で Iconv を使用してエンコーディング変換を行っています。
なので、WINDOWS-31J なページを扱おうとした場合に、iconv が WINDOWS-31J に対応していないと困ってしまうわけです(例外終了してしまう)。

そして、OSX Lion 組み込みの iconv は WINDOWS-31J という名前のエンコーディング(エイリアス)はサポートしていない様です。
どう対応するのが良いのか分からなかったので、とりあえず rvm のパスにパッチを当ててコンパイルした iconv をインストールしてみました。

$ 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
〜

使えているように見えなくもない。