Liste der von Node.js unterstützten Codierungen


136

Ich muss eine Datei lesen, die mit ISO-8859-1 (auch latin1 genannt) codiert ist.

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

Node beschwert sich jedoch darüber, dass "latin1" oder "ISO-8859-1" keine gültige Codierung ist ("Fehler: Unbekannte Codierung").

Welche Kodierungen readFileSyncakzeptieren?


Ich weiß nicht, ob es eine Option ist, die Quelldatei in utf8 zu konvertieren. Wenn ja, hier ist ein Link. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
mathheadinclouds

Antworten:


223

Die Liste der Codierungen , die der Knoten nativ unterstützt, ist ziemlich kurz:

  • ASCII
  • base64
  • verhexen
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binär / latin1 (ISO8859-1, latin1 nur in Knoten 6.4.0+)

Wenn Sie eine ältere Version als 6.4.0 verwenden oder sich nicht mit Nicht-Unicode-Codierungen befassen möchten, können Sie die Zeichenfolge neu codieren:

Verwenden Sie iconv-lite , um Dateien neu zu codieren:

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

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

Alternativ können Sie iconv verwenden :

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
Für diejenigen, die Probleme beim Kompilieren von iconv haben, empfehle ich iconv-lite . Es erfordert keine Kompilierung und ist laut Entwickler schneller als iconv und wird von beliebten Tools wie Grunt, Nodemailer, Yeoman, ...
Telémako

Zur Verwendung mit Electron installieren Sie lib und speichern Sie es als Produktionsabhängigkeit:npm install iconv-lite --save
DenisKolodin

im latin1ascii
Moment

2
Was Sie in der Antwort gesagt haben - dass ISO-8859-1 (aka latin1) nicht unterstützt wird - ist für Node v8.1.4 nicht der Fall. Auf dieser Dokumentationsseite finden Sie alle von Buffer unterstützten Codierungen, einschließlich latin1(deren Alias ​​ist binary).
nbkhope

1
@PanuLogic Wenn Sie von einem Byte - String in eine Zeichenfolge zu konvertieren, müssen Sie einige Codierung. latin1ist reversibel - selbst wenn Ihre Eingabe eine mp4-Videodatei ist, ist die Zeichenfolge gültig (wenn auch bedeutungslos), und die Rückkonvertierung in Bytes ergibt die ursprünglichen Bytes. Verwenden Sie ein Buffer/ Uint8Arrayfür Binärdaten.
Phihag

0

Wenn die obige Lösung für Sie nicht funktioniert, ist es möglicherweise möglich, dasselbe Ergebnis mit dem folgenden reinen NodeJS-Code zu erzielen. Das Obige hat bei mir nicht funktioniert und zu einer Kompilierungsausnahme geführt, wenn 'npm install iconv' unter OSX ausgeführt wurde:

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 () gibt einen Puffer zurück, wenn keine Codierung angegeben ist. Und Buffer verfügt über eine toString () -Methode, die in UTF8 konvertiert wird, wenn keine Codierung angegeben ist, die den Inhalt der Datei angibt. Siehe die Dokumentation zu nodejs. Das hat bei mir funktioniert.


1
Das Problem ist, dass der Puffer davon ausgeht, dass sich die Daten bereits in utf8 befanden, wenn sie nicht angegeben wurden, und keinen Versuch unternimmt, von latin1 nach utf8 zu konvertieren.
Bluesmoon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.