在Windows上使用utf8编码的文件导致node.js读取文件错误

我想在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上进行开发时,最终的解决scheme将被部署到各种非Windows服务器上,例如,如果我将ANSI文件部署到Linux,我担心服务器端会遇到问题。

根据我在这里和谷歌的search代码应该在Windows上工作,因为我特意告诉它期望一个UTF-8文件。

示例configuration我正在阅读:

 { "ListenIP4": "10.10.1.1", "ListenPort": 8080 } 

每个“fs.readFileSync(filename,'utf8')不剥离BOM标记#1918” , fs.readFile按照devise工作: 如果存在, 则不从UTF-8文件的标题剥离BOM。 开发人员可以自行决定处理这个问题。

可能的解决方法:

你得到的是UTF-8文件的字节顺序标记头(BOM)。 当JSON.parse看到这个,它给出了一个语法错误(读:“意外字符”错误)。 在传递给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 

为了得到这个工作,我不得不使用记事本+ +(我假定任何像样的文本编辑器 – 不是记事本 – 有能力select这种编码types)编码从“UTF-8”到“没有BOM的UTF-8”。

这个解决scheme意味着部署人员可以毫不费力地部署到Unix,并且在读取文件的过程中我可以毫无错误地开发。

在阅读文件方面,我有时在旅行中得到的另一个响应是在尝试各种编码选项时在文件内容开始之前附加的一个问号。 当然附带一个问号或ANSI字符,JSON.parse失败。

希望这可以帮助别人!