Node.js ошибка чтения с файлом, закодированным utf8, в окнах

Я пытаюсь загрузить json файл UTF8 с диска, используя node.js(0.10.29) в Windows 8.1. Ниже приведен код:

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.

В соответствии с моими поисками здесь и через Google код должен работать на Windows, поскольку я специально говорю ему, чтобы он ожидал файл UTF-8.

Пример конфигурации, который я читаю:

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

Ответ 1

Per "fs.readFileSync(filename, 'utf8') не разделяет маркеры спецификации # 1918" , fs.readFile работает как запроектированное: BOM не удаляется из заголовка файла UTF-8, если он существует. Это по усмотрению разработчика для этого.

Возможные обходные пути:

То, что вы получаете, это заголовок метки байтового байта (BOM) файла UTF-8. Когда 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

Ответ 2

Чтобы заставить это работать, мне не пришлось менять кодировку с "UTF-8" на "UTF-8 без спецификации" с помощью Notepad ++ (я полагаю, что любой достойный текстовый редактор, а не Notepad, имеет возможность выбирать этот тип кодировки).

Это решение означало, что ребята развертывания могут без проблем перемещаться в Unix, и я мог бы развиваться без ошибок во время чтения файла.

С точки зрения чтения файла другой ответ, который я иногда получал в своих путешествиях, был добавлен вопросительным знаком до начала содержимого файла при попытке использовать различные параметры кодирования. Естественно, что с вопросительным знаком или символами ANSI JSON.parse терпит неудачу.

Надеюсь, это поможет кому-то!