Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 读取node.js应用程序中的文件时出现奇怪的unicode字符_Javascript_Node.js_Unicode_Utf 16_Utf - Fatal编程技术网

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

Javascript 读取node.js应用程序中的文件时出现奇怪的unicode字符,javascript,node.js,unicode,utf-16,utf,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)

我正在尝试编写一个节点应用程序,它读取一组文件,将它们拆分为行,然后将行放入数组中。很简单。除了我正在处理的一些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' ]
输入文件如下所示:

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' ]
输出如下所示:

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”


我不知道这里发生了什么,但它似乎与文件本身中的字符有关。如果我将该文件的文本复制并粘贴到另一个新文件中,并在新文件上运行应用程序,则效果良好。我假设在复制和粘贴过程中,导致此问题的原因正在被剥离。

这可能是
BOM
(字节顺序标记)吗?确保保存文件时不带
BOM表
,或包含代码以剥离
BOM表

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


我知道记事本++有一个功能,您可以轻松地从文件中删除
BOM
<编码>编码>在不带BOM的UTF-8中编码

您的文件是UTF-16小大端,而不是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),因此您必须以其他方式使用该文件或将其转换为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");
使用的lite版本


我在Windows命令提示符下执行了以下操作以转换endianness:

type file.txt > file2.txt

第一个字符的圈数是BOM表。但是,删除它似乎并不能解决“\u0000”问题。我使用记事本++将文件转换为UTF-8,然后使用fs.readFileSync读取文件以删除“SyntaxError:意外令牌”� 在JSON的位置0“哇,你搞定了。非常感谢。出于好奇,你怎么知道这个文件是big-endian UTF-16?有没有办法在节点中检测到这种情况?我正在处理几个文件,但它们的编码方式不尽相同。@user1334007因为偶数位置的空值,如果它们位于奇数位置,则应该是little endian。自动检测编码需要一些启发式方法,通过分析空位置来确定哪个UTF-16和UTF-8具有非常独特的模式。但是,如果不尝试并查看文本是否正确,就无法检测到大多数其他编码。仅供参考,我发现了一些对于节点的字符集检测很有希望的东西:。还没有尝试过,但如果我让它工作起来,我会向您报告。@user1334007是的,但请注意,要可靠地检测编码是不可能的。但是如果你有很多文件和/或无法手动检测它们,这是值得一试的。是的,我试过了,发现没有多大帮助。最后,我在.NET中重新编写了这个工具,它工作得更好。不仅用这个解决方案解决了我解析Apache日志文件的问题,而且文件大小几乎减少到原来的一半。