Node.js は 基本的に UTF-8 で利用するものなので、他のエンコードを使おうと思うと少し工夫が必要になります。 今回は Shift-JIS を例に他のエンコードを利用する方法についてまとめました。
iconv-lite とは
iconv-lite
は Node.js で 文字エンコード変換 を行ってくれるモジュールです。
iconv-lite を使えば Node.js はデフォルトのエンコード以外にも以下のようなエンコードに対応できます。
iconv-lite 対応 エンコーディング (抜粋)
- Node.js デフォルト
"ascii"
"utf8"
"utf16le"
"ucs2"
"base64"
"latin1"
"binary"
"hex"
- Unicode
"UTF-16BE"
"UTF-16"
(with BOM)
- シングルバイト
"cp1252"
- マルチバイト
"Shift_JIS"
"Windows-31j"
"Windows932"
"EUC-JP"
Shift-JIS ファイル を 読み込む
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 | var iconv = require( "iconv-lite" ); var fs = require( "fs" ); var buffer = "" ; var reader = fs.createReadStream( "./data/sample-sjis.txt" ) .pipe(iconv.decodeStream( "Shift_JIS" )); reader.on( "data" , (chunk) => { buffer += chunk; }); reader.on( "readable" , () => { console.log(buffer); }); |
解説
iconv.decode()
を使う方法もありますが、使い勝手を考えると上記のように .pipe()
へ iconv.decodeStream()
を渡す方法が便利です。
fs.createReadStream()
ではエンコードを指定せず、Bufer
で取得する用にします。
Buffer
で読み込んだら .pipe()
で iconv.decodeSrream()
に引き渡します。
戻り値は通常の ReadableStream
なので、data
イベント を拾えば読み取ったデータを指定したエンコードで変換されたものが取得できます。
Shift-JIS ファイル に 書き込む
サンプルコード
1 2 3 4 5 6 7 8 | var iconv = require( "iconv-lite" ); var fs = require( "fs" ); var buffer = "この文字列を書き込む。" ; var writer = fs.createWriteStream( "./data/sample-sjis.txt" ); writer.write(iconv.encode(buffer, "Shift_JIS" )); writer.end(); |
解説
.pipe()
に引き渡して変換できるとラクなのですが…、書き込みの場合は処理順の都合でうまくいきません。
.write()
へ iconv.encode()
で変換した Buffer
を渡して書き込むことで、指定のエンコードで書き込みができます。
参考記事
最後に… このブログに興味を持っていただけた方は、 ぜひ 「Facebookページ に いいね!」または 「Twitter の フォロー」 お願いします!!