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 を渡して書き込むことで、指定のエンコードで書き込みができます。
参考記事