Node.js で Sjift-JIS ファイル を 読み書き する 方法

0 件のコメント

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

参考記事