Ho appena scoperto quel nodo (testato: v0.8.23, git corrente: v0.11.3-pre) ignores any decoding errors nella sua gestione buffer, che sostituisce silenziosamente qualsiasi carattere non-utf8 con '\ufffd'
(il PERSONALIZZATORE DI RICAMBIO Unicode) invece di generare un'eccezione l'input non-utf8. Di conseguenza, fs.readFile
, process.stdin.setEncoding
e gli amici mascherano una grande classe di errori di input non validi.Come posso catturare gli errori di decodifica utf-8 in node.js?
Esempio che non sicuro ma dovrebbe davvero:
> notValidUTF8 = new Buffer([ 128 ], 'binary')
<Buffer 80>
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here!
'�'
> decodedAsUTF8 === '\ufffd'
true
'\ufffd'
è un carattere perfettamente valido che può verificarsi in utf8 legale (come la sequenza ef bf bd
), quindi è non banale scimmia- patch nella gestione degli errori in base a questo mostrando nel risultato.
Scavando un po 'più in profondità, sembra che questo provenga dal nodo che rimanda alle stringhe di v8 e che a loro volta hanno il comportamento sopra, v8 non ha alcun mondo esterno pieno di dati con codifica straniera.
Esistono moduli di nodi o altrimenti che mi consentono di rilevare gli errori di decodifica utf-8, preferibilmente con il contesto in cui è stato rilevato l'errore nella stringa di input o nel buffer?
Anche se non sono sicuro, ma hai guardato il modulo di codifica. Potrebbe fornire un modo per aggirare il tuo problema. https://npmjs.org/package/encoding –
Eseguire la decodifica a mano (beh, come in "non usare i primitivi del nodo") dovrebbe essere sicuro; iconv tramite 'encoding' probabilmente è la strada da percorrere dove esiste questa necessità. – ecmanaut