Я только что обнаружил, что Node (протестирован: v0.8.23, текущий git: v0.11.3-pre) ignores any decoding errors в обработке буфера, молча заменяя любые символы не-utf8 '\ufffd'
(Unicode REPLACEMENT CHARACTER) вместо того, чтобы бросать исключение из вход не-utf8. Как следствие, fs.readFile
, process.stdin.setEncoding
и друзья маскируют большой класс ошибок ввода для вас.Как записывать ошибки декодирования utf-8 в node.js?
Пример, который не подведет, но на самом деле должен:
> notValidUTF8 = new Buffer([ 128 ], 'binary')
<Buffer 80>
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here!
'�'
> decodedAsUTF8 === '\ufffd'
true
'\ufffd'
является вполне допустимым символом, который может произойти в правовом utf8 (как последовательность ef bf bd
), поэтому он не является тривиальным monkey- патч в обработке ошибок на основе этого появляется в результате.
Копаем немного глубже, похоже, что это связано с тем, что узел просто откладывается на строки v8 и что те, в свою очередь, имеют вышеописанное поведение, v8 не имеют внешнего мира, заполненного чужими закодированными данными.
Существуют ли узловые модули или что-то еще, что позволяет мне поймать ошибки декодирования utf-8, предпочтительно с контекстом о том, где ошибка была обнаружена во входной строке или в буфере?
Хотя я не уверен, но вы смотрели на модуль кодирования. Это может стать способом обойти вашу проблему. https://npmjs.org/package/encoding –
Выполнение декодирования вручную (ну, как и в случае «не использовать примитивы узлов») должно быть безопасным; iconv через 'encoding', вероятно, является способом перехода туда, где это необходимо. – ecmanaut