Список кодувань, які підтримує 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
  • база64
  • шестигранний
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • двійковий / latin1 (ISO8859-1, latin1 лише у вузлі 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
— DenisKolodin

наразі, latin1також включений у псевдонімascii
— thybzi

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

1
@PanuLogic Коли ви перетворюєте з байтового рядка в рядок символів, вам потрібно деяке кодування. latin1є оборотним - навіть якщо ваш вхід - це відео-файл mp4, рядок буде дійсним (хоч і безглуздим), і перетворення назад у байти дасть вихідні байти. Використовуйте a Buffer/ Uint8Arrayдля двійкових даних.
— фігаг

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.