我刚刚在其缓冲区处理中发现了Node(已测试:v0.8.23,当前git:v0.11.3-pre)ignores any decoding errors,用'\ufffd'
静默替换任何非utf8字符(Unicode替换CHARACTER)而不是抛出关于非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
),因此基于此显示在错误处理中的猴子补丁是非常重要的。结果
深入挖掘,看起来这源于节点只是推迟到v8的字符串,而那些反过来具有上述行为,v8没有任何外部世界充满外来编码数据。
是否存在节点模块或其他方面让我捕获utf-8解码错误,最好是关于输入字符串或缓冲区中发现错误的位置的上下文?
答案 0 :(得分:8)
我希望你在那些年里解决了这个问题,我有一个类似的问题,并最终解决了这个丑陋的伎俩:
function isValidUTF8(buf){
return Buffer.compare(new Buffer(buf.toString(),'utf8') , buf) === 0;
}
来回转换缓冲区并检查它是否保持不变。
&#39; utf8&#39;编码可以省略。
然后我们有:
> isValidUTF8(new Buffer('this is valid, 指事字 eè we hope','utf8'))
true
> isValidUTF8(new Buffer([128]))
false
> isValidUTF8(new Buffer('\ufffd'))
true
&#39; \ ufffd&#39;字符被正确认为是有效的utf8。
更新:现在这也适用于JXcore
答案 1 :(得分:2)
从节点8.3开始,您可以使用util.TextDecoder彻底解决此问题:
const util = require('util')
const td = new util.TextDecoder('utf8', {fatal:true})
td.decode(Buffer.from('foo')) // works!
td.decode(Buffer.from([ 128 ], 'binary')) // throws TypeError
通过在全局命名空间中使用TextDecoder
,这也将在some browsers中起作用。
答案 2 :(得分:0)
正如Josh C.上面所说:“npmjs.org/package/encoding”
来自npm网站:“编码是node-iconv和iconv-lite的简单包装,可以将字符串从一种编码转换为另一种编码。”
下载:强>
$ npm install encoding
使用示例
var result = encoding.convert(new Buffer([ 128 ], 'binary'), "utf8");
console.log(result); //<Buffer 80>
访问该网站: npm - encoding