情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

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関数を使用しています。

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);
}

使用パッケージ

実行結果

現在のフォルダには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.jstextfile2.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!!');
            }
        });
    }
});

使用パッケージ

実行結果

現在のフォルダにはtextfile.txtという名称のテキストファイルが存在しています(文字コードはUTF-8です)。

C:\work\node>type textfile.txt
これはテキストファイルの内容です。

念のためjschardet-detect.jstextfile.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.jstextfile2.txtの文字コードを判定してみるとSHIFT_JISという結果が出ました。

正しく変換できていることが分かります。

C:\work\node>node jschardet-detect.js textfile2.txt
{ encoding: 'SHIFT_JIS', confidence: 0.99 }

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js