我刚刚发现 Node(已测试:v0.8.23,当前 git:v0.11.3-pre)忽略其缓冲区处理中的任何解码错误,默默地用(Unicode 替换字符)替换任何非 utf8 字符,'\ufffd'
而不是抛出异常非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 中(作为 sequence ef bf bd
),因此基于结果中显示的错误处理,monkey-patch 并非易事。
再深入一点,看起来这源于节点只是遵循 v8 的字符串,而这些字符串又具有上述行为,v8 没有任何外部世界充满了外国编码的数据。
是否有节点模块或其他方式可以让我捕获 utf-8 解码错误,最好有关于在输入字符串或缓冲区中发现错误的上下文?