この記事を書いてる人: 
tea

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

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

 iconv-lite

keyboard

photo by Mr. Alex Garcia - Double Cliche on flickr

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
11
12
13
14
15
16
17
18
19
20
21
var fs = require('fs');
var path = require('path');
var iconv = require('iconv-lite');
var sampleTextData = "この内容が書き出しされます";
var dist = path.join( process.env.PWD || process.cwd() , "書き出されたファイル.txt"); // 書き出すファイルのパス
// uft-8で書き出す場合
// fs.writeFile( dist , sampleTextData, function(err){
// if(err) throw err;
// console.log("ファイルが正常に書き出しされました");
// });
// Shift-jisで書き出しする場合
fs.writeFileSync( dist , "" ); // 空のファイルを書き出す
var fd = fs.openSync( dist, "w"); // ファイルを「書き込み専用モード」で開く
var buf = iconv.encode( sampleTextData , "Shift_JIS" ); // 書き出すデータをShift_JISに変換して、バッファとして書き出す
fs.write( fd , buf , 0 , buf.length , function(err, written, buffer){ // バッファをファイルに書き込む
if(err) throw err;
console.log("ファイルが正常に書き出しされました");
});

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

bash
1
2
$ node index.js
(ファイルが書き出される)

iconv-liteの主な使い方

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

  • デコード

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

  • エンコード

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

そこで、上記のコードでは、書き出すテキストデータをSHift_JISに変換したバッファして、後続の処理に渡しています。

まとめ

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