Node.jsはutf-8推奨ですが、日本ではそれだけで大丈夫というわけにはいきません。
そこで、文字コードを扱えるパッケージを利用することになります。というわけで、今日は、node-iconvについて、少し調べてみました。
これです。
https://github.com/bnoordhuis/node-iconv
ところが、このnode-iconvはいわゆるiconvが扱う文字コードをすべて扱えるというわけではないようです。
そこで、これにlibiconv-1.9.1-ja-patch-1.diff.gz をあてたiconv-jpというのもあります。
https://github.com/xenophy/node-iconv
ちなみに、これらは下記のようにすると簡単に入るわけです。
npm install iconv
npm install iconv-jp
で、
ミルク色の手紙「node-iconvでEUCJP-WIN使おうとしてころんだ。」
http://d.hatena.ne.jp/ushiboy/20110422/1303481470
というブログに触発されて、node-iconvで使える文字コードを調べてみました。
#テスト用のコード
まぁ、上のミルク色の手紙さんのコードのほぼそのまま的焼き直しです(_ _)。
ようするに、new Iconv()した時の引数として与えた文字コード名が使えないと、not supportedというエラーが出ることを利用した動作チェックです。
全部やるときりがないので、まぁ、日本語周辺で使いそうなものをリストアップして大文字で書いたり小文字で書いたりもしてみました。
もちろん、実際に各文字コードで書いたものを変換して比べたというわけではありませんので、そこはご理解ください。
var Iconv = require('iconv').Iconv;
var charsets = [
'SHIFT_JIS',
'Shift_JIS',
'shift_jis',
'shift-jis',
'sjis',
'SJIS',
'SJIS-WIN',
'CP932',
'JIS_C6220-1969-RO',
'JIS_C6229-1984-B',
'JIS_C62201969RO',
'JIS_C62291984B',
'SHIFT_JISX0213',
'EUC-JP-MS',
'EUC-JP',
'EUC-TW',
'EUCJP-MS',
'EUCJP-OPEN',
'EUCJP-WIN',
'EUCJP',
'ISO-2022-JP',
'ISO-2022-JP-1',
'ISO-2022-JP-2',
'ISO-2022-JP-3',
'US-ASCII',
'UCS-2',
'UCS-2BE',
'UCS-2LE',
'UCS-4',
'UCS-4BE',
'UCS-4LE',
'UCS2',
'UCS4',
'UTF-7',
'UTF-8',
'utf-8',
'UTF-16'
];
var charset;
while (charset = charsets.shift()) {
try {
new Iconv(charset, 'utf-8');
console.log('OK : ' + charset);
} catch(e) {
console.log('NG : ' + charset + ': ' + e);
}
}
#iconv@1.2.3の結果
上記テストコードをiconv@1.2.3で試した結果です
tato2@bloga:~$ node charset/iconv/chartest.jp
OK : SHIFT_JIS
OK : Shift_JIS
OK : shift_jis
OK : shift-jis
OK : sjis
OK : SJIS
NG : SJIS-WIN: Error: EINVAL, Conversion not supported.
OK : CP932
OK : JIS_C6220-1969-RO
NG : JIS_C6229-1984-B: Error: EINVAL, Conversion not supported.
NG : JIS_C62201969RO: Error: EINVAL, Conversion not supported.
NG : JIS_C62291984B: Error: EINVAL, Conversion not supported.
OK : SHIFT_JISX0213
NG : EUC-JP-MS: Error: EINVAL, Conversion not supported.
OK : EUC-JP
OK : EUC-TW
NG : EUCJP-MS: Error: EINVAL, Conversion not supported.
NG : EUCJP-OPEN: Error: EINVAL, Conversion not supported.
NG : EUCJP-WIN: Error: EINVAL, Conversion not supported.
OK : EUCJP
OK : ISO-2022-JP
OK : ISO-2022-JP-1
OK : ISO-2022-JP-2
OK : ISO-2022-JP-3
OK : US-ASCII
OK : UCS-2
OK : UCS-2BE
OK : UCS-2LE
OK : UCS-4
OK : UCS-4BE
OK : UCS-4LE
NG : UCS2: Error: EINVAL, Conversion not supported.
NG : UCS4: Error: EINVAL, Conversion not supported.
OK : UTF-7
OK : UTF-8
OK : utf-8
OK : UTF-16
#iconv-jp@1.1.3の結果
テストコードの最初の行を var Iconv = require('iconv-jp').Iconv; と書き換えて、
iconv-jp@1.1.3で試した結果です。
少し増えてるようです。
$ node charset/iconv/chartest.jp
OK : SHIFT_JIS
OK : Shift_JIS
OK : shift_jis
OK : shift-jis
OK : sjis
OK : SJIS
OK : SJIS-WIN
OK : CP932
OK : JIS_C6220-1969-RO
NG : JIS_C6229-1984-B: Error: EINVAL, Conversion not supported.
NG : JIS_C62201969RO: Error: EINVAL, Conversion not supported.
NG : JIS_C62291984B: Error: EINVAL, Conversion not supported.
OK : SHIFT_JISX0213
OK : EUC-JP-MS
OK : EUC-JP
OK : EUC-TW
OK : EUCJP-MS
OK : EUCJP-OPEN
OK : EUCJP-WIN
OK : EUCJP
OK : ISO-2022-JP
OK : ISO-2022-JP-1
OK : ISO-2022-JP-2
OK : ISO-2022-JP-3
OK : US-ASCII
OK : UCS-2
OK : UCS-2BE
OK : UCS-2LE
OK : UCS-4
OK : UCS-4BE
OK : UCS-4LE
NG : UCS2: Error: EINVAL, Conversion not supported.
NG : UCS4: Error: EINVAL, Conversion not supported.
OK : UTF-7
OK : UTF-8
OK : utf-8
OK : UTF-16