Tôi vừa phát hiện ra rằng Node (được kiểm tra: v0.8.23, git hiện tại: v0.11.3-pre) ignores any decoding errors trong việc xử lý Bộ đệm, âm thầm thay thế bất kỳ ký tự không phải utf8 nào bằng '\ufffd'
(Unicode REPLACEMENT CHARACTER) thay vì ném một ngoại lệ về đầu vào không phải là utf8. Kết quả là, fs.readFile
, process.stdin.setEncoding
và bạn bè che dấu một lớp lớn các lỗi nhập sai cho bạn.Làm cách nào để ghi lại các lỗi giải mã utf-8 trong node.js?
Ví dụ mà không thất bại nhưng thực sự nên:
> notValidUTF8 = new Buffer([ 128 ], 'binary')
<Buffer 80>
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here!
'�'
> decodedAsUTF8 === '\ufffd'
true
'\ufffd'
là một nhân vật hoàn toàn hợp lệ có thể xảy ra trong utf8 quy phạm pháp luật (như chuỗi ef bf bd
), vì vậy nó là không tầm thường để monkey- vá lỗi xử lý dựa trên điều này hiển thị trong kết quả.
Đào sâu hơn một chút, có vẻ như nó xuất phát từ nút chỉ trì hoãn chuỗi của v8 và lần lượt có hành vi trên, v8 không có bất kỳ thế giới bên ngoài nào có đầy đủ dữ liệu được mã hóa nước ngoài.
Có mô-đun nút hay cách khác cho phép tôi nắm bắt lỗi giải mã utf-8, tốt nhất là với ngữ cảnh về nơi phát hiện lỗi trong chuỗi đầu vào hoặc bộ đệm?
Trong khi tôi không chắc chắn, nhưng có bạn nhìn vào các mô-đun mã hóa. Nó có thể cung cấp một cách để phá vỡ vấn đề của bạn. https://npmjs.org/package/encoding –
Thực hiện giải mã bằng tay (tốt, như trong "không sử dụng các nút nguyên thủy") phải an toàn; iconv thông qua 'encoding' có lẽ là cách để đi đến nơi mà nhu cầu này tồn tại. – ecmanaut