2013-06-09 12 views
8

Ich habe gerade festgestellt, dass Knoten (getestet: v0.8.23, aktuelle Git: v0.11.3-pre) ignores any decoding errors in seiner Puffer-Handhabung, stillschweigend alle Nicht-UTF8-Zeichen mit '\ufffd' ersetzen (das Unicode ERSATZ CHARACTER), anstatt eine Ausnahme zu werfen die Nicht-UTF8-Eingabe. Als Konsequenz maskieren fs.readFile, process.stdin.setEncoding und Freunde eine große Klasse schlechter Eingabefehler für Sie.Wie kann ich UTF-8-Dekodierungsfehler in node.js erfassen?

Beispiel, die nicht scheitern, aber wirklich soll:

> notValidUTF8 = new Buffer([ 128 ], 'binary') 
<Buffer 80> 
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here! 
'�' 
> decodedAsUTF8 === '\ufffd' 
true 

'\ufffd' ist ein perfekt gültiges Zeichen, die in Recht utf8 (als Folge ef bf bd) auftreten können, so dass es nicht trivial ist, Affen- Patch in der Fehlerbehandlung basierend darauf, dass dies im Ergebnis angezeigt wird.

Wenn man ein wenig tiefer geht, sieht es so aus, als käme dies vom Knoten, der sich nur auf die Strings von v8 zurückzieht und diese wiederum das obige Verhalten haben, v8 keine externe Welt mit fremdcodierten Daten.

Gibt es Node-Module oder andere, die mich UTF-8-Dekodierungsfehler abfangen können, vorzugsweise mit dem Kontext, wo der Fehler in der Eingabezeichenfolge oder dem Puffer entdeckt wurde?

+0

Während ich bin nicht sicher, aber haben Sie auf dem Codiermodul aussah. Es kann einen Weg bieten, um Ihr Problem zu umgehen. https://npmjs.org/package/encoding –

+0

Die Decodierung von Hand (gut, wie in "nicht mit Knoten Primitiven") sollte sicher sein; iconv via 'encoding' ist wahrscheinlich der Weg dahin, wo dieser Bedarf besteht. – ecmanaut

Antwort

6

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

function isValidUTF8(buf){ 
    return Buffer.compare(new Buffer(buf.toString(),'utf8') , buf) === 0; 
    } 

die den Puffer vor und zurück konvertiert und überprüft, bleibt es gleich.

Die Codierung 'utf8' kann entfallen.

Dann haben wir:

> isValidUTF8(new Buffer('this is valid, 指事字 eè we hope','utf8')) 
true 
> isValidUTF8(new Buffer([128])) 
false 
> isValidUTF8(new Buffer('\ufffd')) 
true 

, wo die '\ uFFFD' Zeichen korrekt als gültige UTF-8 angesehen wird.

UPDATE: Jetzt funktioniert dies in JXcore auch

+0

Danke - diese Lösung deckt zumindest alle Situationen ab, in denen verschiedene Normalisierungsformen die Dinge nicht verwirren.(Soweit ich mich erinnere, entschied ich mich für die Werkzeuge, an denen ich zu der Zeit arbeitete, in Pike, einer Sprache mit sehr solidem Unicode-Stammbaum. – ecmanaut

0

Als Josh C. oben gesagt: "npmjs.org/package/encoding"

Von der NPM-Website: „Codierung eine einfache Wrapper um Knoten-iconv und iconv-lite ist Strings von einer Kodierung in konvertieren Ein weiterer."

Download: $ npm install encoding

Beispiel Verwendung

var result = encoding.convert(new Buffer([ 128 ], 'binary'), "utf8"); 
console.log(result); //<Buffer 80> 

Besuchen Sie die Website:npm - encoding

Verwandte Themen