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

Dom*_*nik 19 file-io json 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);
        }


    }
});
Run Code Online (Sandbox Code Playgroud)

运行时出现以下错误:

SyntaxError: Unexpected token ´??
    at Object.parse (native)
    ...
Run Code Online (Sandbox Code Playgroud)

现在,当我将文件编码(使用Notepad ++)更改为ANSI时,它可以正常工作.

任何想法为什么会这样?虽然在Windows上进行开发,但最终解决方案将部署到各种非Windows服务器上,我担心如果我将ANSI文件部署到Linux,我将在服务器端遇到问题.

根据我在这里和谷歌的搜索,代码应该适用于Windows,因为我特别告诉它期望一个UTF-8文件.

示例配置我正在阅读:

{
    "ListenIP4": "10.10.1.1",
    "ListenPort": 8080
}
Run Code Online (Sandbox Code Playgroud)

zam*_*uts 35

每个"fs.readFileSync(文件名,'utf8')不剥离BOM标记#1918",fs.readFile按设计工作:如果存在,则不会从UTF-8文件的标题中删除BOM .它由开发人员自行决定处理.

可能的解决方法:

您得到的是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
Run Code Online (Sandbox Code Playgroud)