我试图在Windows 8.1上使用node.js(0.10.29)从磁盘加载UTF8 json文件。以下是运行的代码:
var http = require('http');
var utils = require('util');
var path = require('path');
var fs = require('fs');
var myconfig;
fs.readFile('./myconfig.json', 'utf8', function (err, data) {
if (err) {
console.log("ERROR: Configuration load - " + err);
throw err;
} else {
try {
myconfig = JSON.parse(data);
console.log("Configuration loaded successfully");
}
catch (ex) {
console.log("ERROR: Configuration parse - " + err);
}
}
});
运行时出现以下错误:
SyntaxError: Unexpected token ´╗┐
at Object.parse (native)
...
现在,当我将文件编码(使用Notepad ++)更改为ANSI时,它可以顺利运行。
为什么会出现这种情况?虽然在Windows上进行开发,但最终解决方案将部署到各种非Windows服务器上,我担心如果我将ANSI文件部署到Linux,我将在服务器端遇到问题,例如。
根据我在这里和谷歌的搜索,代码应该适用于Windows,因为我特意告诉它需要一个UTF-8文件。
我正在阅读的示例配置:
{
"ListenIP4": "10.10.1.1",
"ListenPort": 8080
}
答案 0 :(得分:33)
根据"fs.readFileSync(filename, 'utf8') doesn't strip BOM markers #1918",fs.readFile
正在按设计运行: BOM 不从UTF-8文件的标头中剥离(如果存在)。由开发人员自行决定处理此问题。
可能的解决方法:
data = data.replace(/^\uFEFF/, '');
每https://github.com/joyent/node/issues/1918#issuecomment-2480359 bomstrip
您得到的是UTF-8文件的字节顺序标记标题(BOM)。当JSON.parse
看到此内容时,会出现语法错误(读取:“意外字符”错误)。您必须先从文件中删除字节顺序标记,然后再将其传递给JSON.parse
:
fs.readFile('./myconfig.json', 'utf8', function (err, data) {
myconfig = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, ''));
});
// note: data is an instance of Buffer
答案 1 :(得分:3)
要实现这一点,我不必更改" UTF-8"的编码。 to" UTF-8没有BOM"使用Notepad ++(我假设任何像样的文本编辑器 - 不是记事本 - 都能选择这种编码类型。)
这个解决方案意味着部署人员可以毫不费力地部署到Unix,并且在阅读文件期间我可以毫无错误地开发。
在阅读文件方面,我在旅行中有时得到的另一个响应是在尝试各种编码选项时在文件内容开始之前附加的问号。当然,如果附加了问号或ANSI字符,则JSON.parse会失败。
希望这有助于某人!