Wie kann ich UTF-8-Dekodierungsfehler in node.js erfassen?

8

Ich habe gerade festgestellt, dass der Knoten (getestet: v0.8.23, aktueller Git: v0.11.3-pre) jegliche Decodierungsfehler ignoriert in seiner Buffer-Behandlung, ersetzt im Stillen alle nicht-utf8-Zeichen durch '\ufffd' (das Unicode-Ersatzzeichen), anstatt eine Ausnahme über die nicht-utf8-Eingabe zu werfen. Als Konsequenz maskieren fs.readFile , process.stdin.setEncoding und Freunde eine große Klasse schlechter Eingabefehler für dich.

Beispiel, das nicht fehlschlägt, aber wirklich sollte:

%Vor%

'\ufffd' ist ein vollkommen gültiges Zeichen, das in legal utf8 auftreten kann (als die Sequenz ef bf bd ), also ist es nicht-trivial für affe-patch in der Fehlerbehandlung, basierend darauf, dass es im Ergebnis angezeigt wird.

Wenn man etwas tiefer tippt, sieht es so aus, als ob der Knoten nur auf die Strings von v8 verweist und dass diese wiederum das obige Verhalten haben, wobei v8 keine externe Welt mit fremdcodierten Daten enthält.

Gibt es Knoten-Module oder andere, die mich zu UTF-8-Dekodierfehlern bringen, am besten mit dem Kontext, wo der Fehler in der Eingabezeichenfolge oder im Puffer gefunden wurde?

    
ecmanaut 09.06.2013, 05:39
quelle

2 Antworten

6

Ich hoffe, Sie haben das Problem in diesen Jahren gelöst, ich hatte ein ähnliches Problem und habe es schließlich mit diesem hässlichen Trick gelöst:

%Vor%

konvertiert den Puffer vor und zurück und überprüft, ob er gleich bleibt.

Die Codierung 'utf8' kann weggelassen werden.

Dann haben wir:

%Vor%

wobei das '\ ufffd' Zeichen korrekt als gültiges utf8 betrachtet wird.

UPDATE : Das funktioniert jetzt auch in JXcore

    
Jacopofar 28.08.2015, 20:28
quelle
0

Wie Josh C. oben sagte: "npmjs.org/package/encoding"

Von der npm-Website: "encoding ist ein einfacher Wrapper um node-iconv und iconv-lite, um Strings von einer Codierung in eine andere zu konvertieren."

Download: $ npm install encoding

Beispiel Verwendung

%Vor%

Besuchen Sie die Website: npm - encoding

    
Tgwizman 10.11.2013 02:27
quelle