情報アイランド

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

Node.jsでストリームからBOM(バイトオーダーマーク)を取り除く

2016/04/03

文字コードがUTF-8のテキストファイルを読み込むとテキストの先頭にBOMが付加されていることがあります。

BOMが付加されているとJSON.parse関数で下のようなUnexpected tokenというSyntaxErrorが発生することがあります。他にも予期しないエラーが発生する可能性があります。

SyntaxError: Unexpected token 
    at Object.parse (native)
    at C:\work\node\ejs-render.js:19:44
    at tryToString (fs.js:414:3)
    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:401:12)

そのため、文字コードがUTF-8のテキストファイルを読み込んだ場合にはBOMを取り除く処理を行っておくべきです。


ストリームからBOMを取り除くには、node-bomstrip-streamパッケージのbomstripモジュールを利用します。

bomstrip関数を呼び出します。

返り値としてBOMを取り除くストリームが得られます。


なお、ストリームの詳しい使い方に関しては下の記事を参照してください。

サンプルコード1

コマンドライン引数として与えられたテキストファイルを読み込み、BOMを取り除き、標準出力に出力します。

bomstrip.js

var fs = require('fs');
var bomstrip = require('bomstrip');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

try {
    var str = '';
    var rs = fs.createReadStream(process.argv[2], 'utf-8');
    rs.on('error', function (err) {
        console.error(err);
        process.exit(1);
    });
    var bs = new bomstrip();
    bs.setEncoding('utf-8');
    bs.on('data', function (data) {
        for (var i = 0; i < data.length; i++) {
            if (data[i] == '\n') {
                console.log(str);
                str = '';
            }
            else {
                str += data[i];
            }
        }
    });
    bs.on('end', function () {
        console.log(str);
    });
    bs.on('error', function (err) {
        console.error(err);
        process.exit(1);
    });
    rs.pipe(bs);
}
catch (err) {
    console.error(err);
}

使用パッケージ

実行結果

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

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

関連

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

-Node.js