在node.js应用程序中读取文件时出现奇怪的Unicode字符

我正在尝试编写一个读取一组文件的节点应用程序,将它们分成几行,并将行放入一个数组中。 很简单。 它工作在不同的文件,除了我正在使用的一些SQL文件。 出于某种原因,当我分割线时,我似乎正在获得某种unicode输出。 该应用程序看起来像这样:

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

input文件如下所示:

 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”。

我不知道这里发生了什么,但似乎与文件本身中的字符有关。 如果我复制并粘贴文件的文本到另一个新的文件,并在新文件上运行应用程序,它工作正常。 我假设无论是造成这个问题正在剥离复制和粘贴过程中。

你的文件是UTF-16小 Endian,而不是UTF-8。

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

不幸的是,node.js只支持UTF-16 Little Endian或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"); 

这可能是BOM (字节顺序标记)? 确保保存没有BOM或包含代码的文件以去除BOM

BOM通常在文本编辑器中不可见。

我知道记事本++有一个function,您可以轻松地从文件中删除一个BOMEncoding > Encode in UTF-8 without BOM

使用精简版的Iconv-lite

 var result= ""; var iconv = require('iconv-lite'); var stream = fs.createReadStream(sourcefile) .on("error",function(err){ //handle error }) .pipe(iconv.decodeStream('win1251')) .on("error",function(err){ //handle error }) .on("data",function(data){ result += data; }) .on("end",function(){ //use result });