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 терпит неудачу.
Надеюсь, это поможет кому-то!