13

ファイルのセットを読み取り、それらを行に分割し、行を配列に入れるノードアプリを作成しようとしています。ものすごく単純。私が扱っているいくつかのSQLファイルを除いて、かなりの数のファイルで動作します。何らかの理由で、行を分割すると、ある種のユニコード出力が得られるようです。アプリは次のようになります。

fs = require("fs");
var data = fs.readFileSync("test.sql", "utf8");
console.log(data);
lines = data.split("\n");
console.log(lines);

入力ファイルは次のようになります。

use whatever
go

出力は次のようになります。

��use whatever
go

[ '��u\u0000s\u0000e\u0000 \u0000w\u0000h\u0000a\u0000t\u0000e\u0000v\u0000e\u0000r\u0000',
  '\u0000g\u0000o\u0000',
  '\u0000' ]

ご覧のとおり、ファイルの先頭にある種の認識されない文字があります。データを読み込んで直接出力すると、この文字以外は問題ないように見えます。ただし、それを行に分割しようとすると、これらすべての Unicode のような文字が表示されます。基本的には、それぞれの先頭に「\u0000」が付いたすべての実際の文字です。

ここで何が起こっているのかわかりませんが、ファイル自体の文字に関係があるようです。ファイルのテキストをコピーして別の新しいファイルに貼り付け、新しいファイルでアプリを実行すると、正常に動作します。この問題の原因は、コピーと貼り付けのプロセス中に取り除かれていると思います。

4

4 に答える 4

25

ファイルはUTF-16LittleにありますUTF-8ではなくエンディアン。

var data = fs.readFileSync("test.sql", "utf16le"); //Not sure if this eats the BOM

残念ながら、node.jsはUTF-16リトルエンディアンまたはUTF-16LEのみをサポートしているため(ドキュメントを読んでもわかりません。わずかな違いがあります。つまり、UTF-16LEはBOMを使用しません)、iconvを使用する必要があります。または、ファイルを他の方法でUTF-8に変換します。

例:

var Iconv  = require('iconv').Iconv,
    fs = require("fs");

var buffer = fs.readFileSync("test.sql"),
    iconv = new Iconv( "UTF-16", "UTF-8");

var result = iconv.convert(buffer).toString("utf8");
于 2013-01-18T17:14:53.610 に答える
2

これはおそらくBOM(Byte-Order-Mark)ですか?BOMを削除するコードを含めずにファイルを保存してくださいBOM

通常、BOMテキスト エディタでは表示されません。

Notepad++ にはBOM、ファイルから簡単に削除できる機能があることを知っています。Encoding > Encode in UTF-8 without BOM.

于 2013-01-18T16:37:48.847 に答える