node-iconvでEUCJP-WIN使おうとしてころんだ。
node.jsはutf-8が前提なので、sjisだのeucだのは変換してあげないとダメですよ。
とのことなので、扱いたかったデータがeucだったので、node-iconvを入れて変換してみた。
node-iconvのインストールと変換処理
npmで入れる。
$ npm install iconv
こんな感じで使う。
/** * 省略 */ // Iconv var Iconv = require('iconv').Iconv; // EUC to UTF-8なコンバータを生成 var conv = new Iconv('EUC-JP', 'UTF-8//TRANSLIT//IGNORE'); // バッファをコンバートしてUTF-8なデータにする var data = (conv.convert(buf)).toString('utf8'); /** * 省略 */
機種依存文字(だったっけ?)に対応したくなった
このまでも概ね問題ないんだけど、ローマ数字みたいなのがダメになっちゃうので、
EUC-JPの代わりにEUCJP-WINを指定して、//TRANSLIT//IGNOREを外す。
で、実行したら、エラーになった。
エラーメッセージ。
Error: EINVAL, Conversion not supported.
サポートしてないよってことっぽいので調べてみる。
調査コード。
var sys = require('sys'); var Iconv = require('iconv').Iconv; var charsets = [ 'EUC-JP-MS', 'EUC-JP', 'EUCJP-MS', 'EUCJP-OPEN', 'EUCJP-WIN', 'EUCJP' ]; var charset; while (charset = charsets.shift()) { try { new Iconv(charset, 'utf-8'); } catch(e) { sys.log('Fail : ' + charset); sys.log(e); } }
結果。
$ node a.js 22 Apr 22:43:16 - Fail : EUC-JP-MS 22 Apr 22:43:16 - Error: EINVAL, Conversion not supported. 22 Apr 22:43:16 - Fail : EUCJP-MS 22 Apr 22:43:16 - Error: EINVAL, Conversion not supported. 22 Apr 22:43:16 - Fail : EUCJP-OPEN 22 Apr 22:43:16 - Error: EINVAL, Conversion not supported. 22 Apr 22:43:16 - Fail : EUCJP-WIN 22 Apr 22:43:16 - Error: EINVAL, Conversion not supported.
EUCJPとEUC-JPしかサポートしてなのね。
パッチを当てる。
対応させるために、こちらで公開されているlibiconv-1.13-ja-1.patch.gzを当てる。
node-iconvのlibiconvディレクトリがあるところまで移動。
$ cd .node_libraries/.npm/iconv/1.1.0/package/deps/
パッチをダウンロード。
$ wget http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-ja-1.patch.gz
libiconvのディレクトリに入ってパッチあてる。改めてビルドする。
$ cd libiconv-1.13.1/ $ gzip -dc ../libiconv-1.13-ja-1.patch.gz | patch -p1 $ ./configure --disable-shared --enable-static --enable-relocatable --enable-extra-encodings $ make
.node_libraries/.npm/iconv/1.1.0/packageまでちょっと戻って、node-iconvのあたりも改めてビルドする。
$ cd ../../ $ g++ -Ideps/libiconv-1.13.1/include -I/usr/local/include/node -O2 -fPIC -Wall -ansi -c -o iconv.o iconv.cc $ g++ -shared -o iconv.node iconv.o deps/libiconv-1.13.1/lib/.libs/libiconv.a
動作確認。
さっきの確認スクリプトをもう一度実行する。
$ node a.js
こんどはOK。
変換処理の方も実行してみて確認。
/** * 省略 */ // EUC to UTF-8なコンバータを生成 var conv = new Iconv(EUCJP-WIN', 'UTF-8'); /** * 省略 */
変換できた。