Я только что обнаружил, что Node (проверено: v0.8.23, текущий git: v0.11.3-pre) игнорирует любые ошибки декодирования в обработке буфера, молча заменяя любые символы не-utf8 '\ufffd'
(Unicode REPLACEMENT CHARACTER) вместо того, чтобы бросать исключение из ввода non-utf8. Как следствие, fs.readFile
, process.stdin.setEncoding
и друзья маскируют для вас большой класс ошибок ввода.
Пример, который не терпит неудачу, но действительно должен:
> notValidUTF8 = new Buffer([ 128 ], 'binary')
<Buffer 80>
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here!
'�'
> decodedAsUTF8 === '\ufffd'
true
'\ufffd'
является вполне допустимым символом, который может иметь место в юридическом utf8 (как последовательность ef bf bd
), поэтому нетривиально для monkey-patch при обработке ошибок на основе этого, появляющегося в результате.
Копаясь немного глубже, похоже, что это связано с тем, что Node просто откладывается на строки v8 и что те, в свою очередь, имеют вышеуказанное поведение, v8 не имеют никакого внешнего мира, заполненного данными с внешним кодированием.
Существуют ли Node модули или что-то другое, что позволяет мне поймать ошибки декодирования utf-8, предпочтительнее с контекстом о том, где ошибка была обнаружена во входной строке или буфере?