2011-04-22
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'); /** * 省略 */
変換できた。
トラックバック - http://d.hatena.ne.jp/ushiboy/20110422/1303481470
リンク元
- 821 http://www.google.co.jp/url?sa=t&rct=j&q=access-control-allow-origin&source=web&cd=2&ved=0CCkQFjAB&url=http://d.hatena.ne.jp/ushiboy/20100901/1283349650&ei=_g6ETofvFefeiAKwtIW5DA&usg=AFQjCNGW6nbdFYMLqVzofPZCc1SgjWgd9w
- 333 http://www.google.co.jp/url?sa=t&rct=j&q=webworker&source=web&cd=1&ved=0CBsQFjAA&url=http://d.hatena.ne.jp/ushiboy/20101021/1287667594&ei=LCyEToz9N-3nmAXE-oz3Dw&usg=AFQjCNEJf1ZI6poZ8tqX_250qROWGTRPxw&sig2=bG7WEVXjQXQ_UgoxMfU8OQ
- 125 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCsQFjAA&url=http://d.hatena.ne.jp/ushiboy/20101021/1287667594&ei=AcYYT6vBMYP2mAWN0cCECg&usg=AFQjCNEJf1ZI6poZ8tqX_250qROWGTRPxw&sig2=vqLyL8kZgr1DnsASGzNQaA
- 121 http://stackoverflow.com/questions/6411570/how-to-convert-character-encoding-from-cp932-to-utf-8-in-nodejs-javascript-using
- 116 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=Access-Control-Allow-Origin
- 109 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CDIQFjAC&url=http://d.hatena.ne.jp/ushiboy/20100901/1283349650&ei=bGxLT-7nMurSmAW7pri-Ag&usg=AFQjCNGW6nbdFYMLqVzofPZCc1SgjWgd9w&sig2=6zKO9jXRmOt1n5Wc74OFLw
- 78 http://www.google.co.jp/search?q=Access-Control-Allow-Origin&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 74 http://kjirou.sakura.ne.jp/mt/2011/03/cookie_1.html
- 59 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=Access-Control-Allow-Origin
- 58 http://www.google.co.jp/url?sa=t&source=web&cd=2&ved=0CCMQFjAB&url=http://d.hatena.ne.jp/ushiboy/20100901/1283349650&rct=j&q=Access-Control-Allow-Origin&ei=tcW3TdXaOJGOvQPal8SiAw&usg=AFQjCNGW6nbdFYMLqVzofPZCc1SgjWgd9w&cad=rja