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


136

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

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

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

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


Я не знаю, если это вариант для преобразования исходного файла в UTF8. Если это так, вот ссылка. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
— mathheadinclouds

Ответы:


223

Список кодировок , что узел поддерживает изначально является довольно коротким:

  • ASCII
  • base64
  • наговор
  • ucs2 / ucs2 / UTF16LE / UTF16LE
  • utf8 / utf8
  • двоичный / латинский (ISO8859-1, латинский только в узле 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');
}

1
Для тех, у кого проблемы с компиляцией iconv, я рекомендую iconv-lite . Он не требует компиляции и, по словам разработчика, быстрее, чем iconv, и он используется популярными инструментами, такими как Grunt, Nodemailer, Yeoman, ...
— Telémako

Для использования с Electron установите lib и сохраните как производственную зависимость:npm install iconv-lite --save
— ДенисКолодин

на данный момент, latin1также включен в качестве псевдонимаascii
— Thybzi

2
То, что вы сказали в ответе - что ISO-8859-1 (aka latin1) не поддерживается - не относится к Node v8.1.4. Посмотрите эту страницу документации, чтобы увидеть все кодировки, поддерживаемые Buffer, включая latin1(чей псевдоним binary).
— nbkhope

1
@PanuLogic Когда вы преобразуете строку байтов в строку символов, вам нужно немного кодирования. latin1является обратимым - даже если ваш ввод - видеофайл mp4, строка будет действительной (хотя и бессмысленной), и преобразование обратно в байты даст исходные байты. Используйте Buffer/ Uint8Arrayдля двоичных данных.
— phihag

0

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

npm install iconv

npm WARN package.json portalServer@0.1.0 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

> iconv@2.0.4 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. Это сработало для меня.


1
Проблема в том, что Буфер предполагает, что данные уже были в utf8, если не указан, и не будет пытаться выполнить преобразование из latin1 в utf8.
— Bluesmoon
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.