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 ファイル を 読み込む
サンプルコード
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 ファイル に 書き込む
サンプルコード
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 の フォロー」 お願いします!!