node.jsのfs.readFile()を使って、Shift-jisのテキストファイルを読み出したいと思いました。ただし、node.jsはShift-jisをサポートしていないので、通常の方法で読み込むと、文字化けしてしまいます。

そこで、iconv-liteを使います。iconv-liteは様々な文字コードを変換するモジュールです。

iconv-lite

Shift-jisのテキストファイルを読み込む

それでは、Shift-jisのテキストファイルを、node.jsで扱う簡単なコードを載せてみたいと思います。まずはiconv-liteをnpmインストールします。

bash
1
2
$ npm init
$ npm install iconv-lite --save

続いて、node.jsのコードを作成し、以下のように記述します。

bash
1
$ vim index.js
index.js
1
2
3
4
5
6
7
8
9
10
var fs    = require('fs');
var iconv = require('iconv-lite');

fs.readFile('path-to/shift-jis.txt', function(err, data){
if (err) throw err;
// console.log( data.toString('UTF-8') ); // (参考)UTF-8の場合はtoString()メソッドで文字列を取り出せる
var buf = new Buffer(data, 'binary'); //バイナリバッファを一時的に作成する
var retStr = iconv.decode(buf, "Shift_JIS"); //作成したバッファを使い、iconv-liteでShift-jisからutf8に変換
console.log(retStr);
});

読み出そうとするテキストファイルの文字セット(エンコード)がUTF-8の場合は、上記のコードのようにdata.toString('UTF-8')だけで文字を取り出す事ができます。

だたし、テキストファイルの中身がSHIFT-JISの場合は、iconv-liteを使います。具体的にはiconv.decode(buf, "Shift_JIS")を使い、文字コードをSHIFT-JISからUTF-8に変換します。

最後にnode.jsを実行します。

bash
1
2
$ node index.js
(ここにテキストファイルshift-jis.txtの中身が表示される)

iconv-liteの主な使い方

iconv-liteの基本的な使い方は、少し分かりにくいのですが、ざっくり言って以下の2つです。

  • デコード

    入力された任意の文字コード文字列が入っているバッファを、文字コードのutf8に変換。Stringで返す

  • エンコード

    入力された文字列を、任意の文字コードで変換。Bufferで返す

そこで、上記のコードでは、読み込んだテキストデータを一端バッファに変換して、iconv-lite.decode()に渡しています。

まとめ

いかがだったでしょうか?今回はnode.jsでShif-jis形式のテキストファイルを文字化けすることなく開く方法を解説しました。通常、node.jsではutf-8形式しか開けませんが、iconv-liteなどの変換モジュールを使うと様々な文字セットを開くことができます。