Lista kodowań obsługiwanych przez Node.js.


140

Muszę przeczytać plik zakodowany w ISO-8859-1 (zwany także latin1), coś takiego:

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

Jednak Node narzeka, że ​​„latin1” lub „ISO-8859-1” nie są prawidłowym kodowaniem („Błąd: nieznane kodowanie”).

Jakie kodowania są readFileSyncakceptowane?


Nie wiem, czy jest to opcja konwersji pliku źródłowego na utf8. Jeśli tak, oto link. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
— mathheadinclouds

Odpowiedzi:


235

Lista kodowań że węzeł obsługuje natywnie jest dość krótka:

  • ascii
  • base64
  • klątwa
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binarny / latin1 (ISO8859-1, latin1 tylko w węźle 6.4.0+)

Jeśli używasz starszej wersji niż 6.4.0 lub nie chcesz zajmować się kodowaniem innym niż Unicode, możesz przekodować ciąg:

Użyj iconv-lite do przekodowania plików:

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

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

Alternatywnie użyj 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
Tym, którzy mają problemy z kompilacją iconv, polecam iconv-lite . Nie wymaga kompilacji i według twórcy jest szybszy niż iconv i jest używany przez popularne narzędzia, takie jak Grunt, Nodemailer, Yeoman, ...
— Telémako

Aby korzystać z Electron, zainstaluj lib i zapisz jako zależność produkcyjną:npm install iconv-lite --save
— DenisKolodin

na razie latin1jest również uwzględniony jako aliasascii
— THYBZI

2
To, co powiedziałeś w odpowiedzi - że ISO-8859-1 (aka latin1) nie jest obsługiwane - nie dotyczy Node 8.1.4. Zobacz tę stronę dokumentacji, aby zobaczyć wszystkie kodowania obsługiwane przez Buffer, które obejmują latin1(którego alias to binary).
— nbkhope

1
@PanuLogic Kiedy konwertujesz ciąg bajtów na ciąg znaków, potrzebujesz trochę kodowania. latin1jest odwracalne - nawet jeśli dane wejściowe to plik wideo mp4, ciąg będzie prawidłowy (aczkolwiek bez znaczenia), a konwersja z powrotem na bajty da oryginalne bajty. Użyj Buffer/ Uint8Arraydla danych binarnych.
— phihag

0

Jeśli powyższe rozwiązanie nie zadziała, może być możliwe uzyskanie tego samego wyniku za pomocą następującego czystego kodu nodejs. Powyższe nie zadziałało dla mnie i spowodowało wyjątek kompilacji podczas uruchamiania 'npm install iconv' na 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 () zwraca bufor, jeśli nie określono kodowania. A Buffer ma metodę toString (), która konwertuje do UTF8, jeśli nie zostanie określone kodowanie, podając zawartość pliku. Zobacz dokumentację nodejs. To zadziałało dla mnie.


1
Problem polega na tym, że bufor zakłada, że ​​dane były już w utf8, jeśli nie zostaną określone, i nie podejmie próby konwersji z latin1 na utf8.
— bluesmoon

0

Kodowanie jest opisane w dokumentacji bufora .

Bufory i kodowanie znaków :

Kodowanie znaków

  • utf8: Wielobajtowe zakodowane znaki Unicode. Wiele stron internetowych i innych formatów dokumentów korzysta z UTF-8. To jest domyślne kodowanie znaków.
  • utf16le: Wielobajtowe zakodowane znaki Unicode. W przeciwieństwie do tego utf8, każdy znak w ciągu zostanie zakodowany przy użyciu 2 lub 4 bajtów.
  • latin1: Latin-1 oznacza ISO-8859-1. To kodowanie znaków obsługuje tylko znaki Unicode od U+0000do U+00FF.

Kodowanie plików binarnych na tekst

  • base64: Kodowanie Base64. Podczas tworzenia bufora z łańcucha, to kodowanie będzie również poprawnie akceptować „Bezpieczny alfabet adresów URL i nazw plików”, jak określono w dokumencie RFC 4648, sekcja 5.
  • hex: Koduj każdy bajt jako dwa znaki szesnastkowe.

Starsze kodowanie znaków

  • ascii: Tylko dla 7-bitowych danych ASCII. Ogólnie rzecz biorąc, nie powinno być powodu, aby używać tego kodowania, ponieważ „utf8” (lub, jeśli wiadomo, że dane zawsze obejmują tylko ASCII, „latin1”) będzie lepszym wyborem podczas kodowania lub dekodowania tekstu zawierającego tylko ASCII.
  • binary: Alias ​​dla „latin1”.
  • ucs2: Alias ​​„utf16le”.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.