Node.jsでデータの文字コードを変換する
2016/08/10
目次
データの文字コードを変換するにはiconv-lite
モジュールを利用します。
文字コード
文字コードがiconv-lite
モジュールがサポートしているものであるかチェックするにはiconvLite.encodingExists
関数を使用します。
var iconvLite = require('iconv-lite');
var supported = iconvLite.encodingExists('xxx');
第1引数に文字コードを指定します。
返り値として文字コードがサポートしているものであるかが真偽値として得られます。
変換ストリーム
データの文字コードをUTF-8
に変換するストリームを作成するにはiconvLite.decodeStream
関数を使用します。
ストリームとは?
var ds = iconvLite.decodeStream('xxx');
第1引数に変換前の文字コードを指定します。
返り値としてストリームが得られます。
逆変換ストリーム
データの文字コードをUTF-8
から変換するストリームを作成するにはiconvLite.encodeStream
関数を使用します。
var es = iconvLite.encodeStream('xxx');
第1引数に変換後の文字コードを指定します。
返り値としてストリームが得られます。
変換
データの文字コードをUTF-8
に変換するにはiconvLite.decode
関数を使用します。
var str = iconvLite.decode(buf, 'xxx');
第1引数にバッファを指定します。
第2引数に変換前の文字コードを指定します。
返り値として文字列が得られます。
逆変換
データの文字コードをUTF-8
から変換するにはiconvLite.encode
関数を使用します。
var buf = iconvLite.decode('xxx', 'yyy');
第1引数に文字列を指定します。
第2引数に変換後の文字コードを指定します。
返り値としてバッファが得られます。
サンプルコード1
iconvLite.decodeStream
関数やiconvLite.encodeStream
関数などの使用例です。
3つ目のコマンドライン引数として与えられたテキストファイルのデータをストリームを使用して読み込み、4つ目のコマンドライン引数として与えられた文字コードから6つ目のコマンドライン引数として与えられた文字コードに変換し、5つ目のコマンドライン引数として与えられたテキストファイルにストリームを使用して書き込みます。
文字コードがiconv-lite
モジュールがサポートしていないものである場合にはエラーとします。
なお、ストリームの処理のためにpump
関数を使用しています。
pump関数とは?
iconv-lite-stream.js
var fs = require('fs');
var iconvLite = require('iconv-lite');
var pump = require('pump');
if (process.argv.length < 6) {
console.error('lack argument.');
process.exit(1);
}
if (!iconvLite.encodingExists(process.argv[3]) || !iconvLite.encodingExists(process.argv[5])) {
console.error('encoding does not exist.');
process.exit(1);
}
try {
var rs = fs.createReadStream(process.argv[2]);
var ds = iconvLite.decodeStream(process.argv[3]);
var es = iconvLite.encodeStream(process.argv[5]);
var ws = fs.createWriteStream(process.argv[4]);
pump(rs, ds, es, ws, function (err) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log('finished!!')
}
});
}
catch (err) {
console.error(err);
process.exit(1);
}
使用パッケージ
- Pure JS character encoding conversion
npm install iconv-lite
でインストールします。 - pump
npm install pump
でインストールします。
実行結果
現在のフォルダにはtextfile.txt
という名称のテキストファイルが存在しています(文字コードはUTF-8
です)。
C:\work\node>type textfile.txt
これはテキストファイルの内容です。
念のため別の記事で作成したjschardet-detect.js
(→データの文字コードを判定する)でtextfile.txt
の文字コードを判定してみるとUTF-8
という結果が出ました。
C:\work\node>node jschardet-detect.js textfile.txt
{ encoding: 'UTF-8', confidence: 1 }
上のコードでtextfile.txt
の文字コードを変換してみます。出力ファイルの名称はtextfile2.txt
とし、変換後の文字コードはSHIFT_JIS
とします。
C:\work\node>node iconv-lite-stream.js textfile.txt utf-8 textfile2.txt SHIFT_JIS
finished!!
jschardet-detect.js
でtextfile2.txt
の文字コードを判定してみるとSHIFT_JIS
という結果が出ました。
正しく変換できていることが分かります。
C:\work\node>node jschardet-detect.js textfile2.txt
{ encoding: 'SHIFT_JIS', confidence: 0.99 }
サンプルコード2
iconvLite.decode
関数やiconvLite.encode
関数などの使用例です。
3つ目のコマンドライン引数として与えられたテキストファイルのデータを読み込み、4つ目のコマンドライン引数として与えられた文字コードから6つ目のコマンドライン引数として与えられた文字コードに変換し、5つ目のコマンドライン引数として与えられたテキストファイルに書き込みます。
文字コードがiconv-lite
モジュールがサポートしていないものである場合にはエラーとします。
iconv-lite.js
var fs = require('fs');
var iconvLite = require('iconv-lite');
if (process.argv.length < 6) {
console.error('lack argument.');
process.exit(1);
}
if (!iconvLite.encodingExists(process.argv[3]) || !iconvLite.encodingExists(process.argv[5])) {
console.error('encoding does not exist.');
process.exit(1);
}
fs.readFile(process.argv[2], function (err, data) {
if (err) {
console.error(err);
process.exit(1);
}
else {
fs.writeFile(process.argv[4], iconvLite.encode(iconvLite.decode(data, process.argv[3]), process.argv[5]), function (err) {
if (err) {
console.error(err);
process.exit(1);
}
else {
console.log('finished!!');
}
});
}
});
使用パッケージ
- Pure JS character encoding conversion
npm install iconv-lite
でインストールします。
実行結果
現在のフォルダにはtextfile.txt
という名称のテキストファイルが存在しています(文字コードはUTF-8
です)。
C:\work\node>type textfile.txt
これはテキストファイルの内容です。
念のためjschardet-detect.js
でtextfile.txt
の文字コードを判定してみるとUTF-8
という結果が出ました。
C:\work\node>node jschardet-detect.js textfile.txt
{ encoding: 'UTF-8', confidence: 1 }
上のコードでtextfile.txt
の文字コードを変換してみます。出力ファイルの名称はtextfile2.txt
とし、変換後の文字コードはSHIFT_JIS
とします。
C:\work\node>node iconv-lite.js textfile.txt utf-8 textfile2.txt SHIFT_JIS
finished!!
jschardet-detect.js
でtextfile2.txt
の文字コードを判定してみるとSHIFT_JIS
という結果が出ました。
正しく変換できていることが分かります。
C:\work\node>node jschardet-detect.js textfile2.txt
{ encoding: 'SHIFT_JIS', confidence: 0.99 }
関連
