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');
/**
 * 省略
 */


変換できた。