Список кодировок, поддерживаемых Node.js

Мне нужно прочитать файл, который закодирован с ISO-8859-1 (также называется latin1), примерно так:

var file_contents = fs.readFileSync("test_data.html", "latin1");

Однако Node жалуется на то, что "latin1" или "ISO-8859-1" не является допустимым кодированием ( "Ошибка: неизвестная кодировка" ).

Какие кодировки принимают readFileSync?

Ответ 1

Список кодировок, который поддерживает node, относительно короткий:

  • ASCII
  • base64
  • двоичная
  • шестигранной
  • ucs2/ucs2/UTF16LE/UTF16LE
  • utf8/utf8
  • latin1 (ISO8859-1, только в node 6.4.0 +)

Если вы используете более старую версию, чем 6.4.0, или не хотите иметь дело с кодировками, отличными от Unicode, вы можете перекодировать строку:

Используйте iconv-lite для перекодировки файлов:

var iconvlite = require('iconv-lite');
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    return iconvlite.decode(content, encoding);
}

В качестве альтернативы используйте iconv:

var Iconv = require('iconv').Iconv;
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    var iconv = new Iconv(encoding, 'UTF-8');
    var buffer = iconv.convert(content);
    return buffer.toString('utf8');
}

Ответ 2

Если вышеприведенное решение не работает для вас, возможно, получится получить тот же результат со следующим чистым кодом nodejs. Вышеупомянутое не помогло мне и привело к исключению компиляции при запуске "npm install iconv" в OSX:

npm install iconv

npm WARN package.json [email protected] No README.md file found!
npm http GET https://registry.npmjs.org/iconv
npm http 200 https://registry.npmjs.org/iconv
npm http GET https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz
npm http 200 https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz

> [email protected] install /Users/markboyd/git/portal/app/node_modules/iconv
> node-gyp rebuild

gyp http GET http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
gyp http 200 http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
xcode-select: Error: No Xcode is selected. Use xcode-select -switch <path-to-xcode>, or see the xcode-select manpage (man xcode-select) for further information.

fs.readFileSync() возвращает буфер, если не указана кодировка. И Buffer имеет метод toString(), который преобразует в UTF8, если не указана кодировка, дающая вам содержимое файла. См. Документацию nodejs. Это сработало для меня.