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

时间:2013-01-18 16:36:19

标签: javascript node.js unicode utf-16 utf

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

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 个答案:

答案 0 :(得分:18)

你的文件是UTF-16 Little Big 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");

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

使用精简版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
    });

答案 3 :(得分:0)

我在Windows命令提示符下执行了以下操作,以转换字节序:

type file.txt > file2.txt