如何在node.js中捕获utf-8解码错误?
我刚刚发现Node(testing:v0.8.23,当前git:v0.11.3-pre) 忽略了其缓冲区处理中的任何解码错误 ,用'\ufffd'
(Unicodereplace字符)静默地replace了任何非utf8字符,而不是抛出关于非utf8input的exception。 因此, fs.readFile
, process.stdin.setEncoding
和朋友为您屏蔽了一大类错误的input错误。
不失败,但真的应该:
> notValidUTF8 = new Buffer([ 128 ], 'binary') <Buffer 80> > decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here! ' ' > decodedAsUTF8 === '\ufffd' true
'\ufffd'
是一个非常有效的字符,可以在合法的utf8中出现(如同ef bf bd
),所以在error handling中基于这个结果显示猴子补丁是不平凡的。
挖掘更深一层,看起来这是源于节点只是推迟到V8的string,而这些又有上述行为,V8没有任何外部世界充满外部编码的数据。
是否有节点模块或其他,让我赶上utf-8解码错误,最好与上下文有关在inputstring或缓冲区中发现错误的上下文?
我希望你们解决了那个年代的问题,我有了一个类似的问题,最终用这个丑陋的手段解决了:
function isValidUTF8(buf){ return Buffer.compare(new Buffer(buf.toString(),'utf8') , buf) === 0; }
它来回转换缓冲区,并检查它保持不变。
'utf8'编码可以省略。
那么我们有:
> isValidUTF8(new Buffer('this is valid, 指事字 eè we hope','utf8')) true > isValidUTF8(new Buffer([128])) false > isValidUTF8(new Buffer('\ufffd')) true
'\ ufffd'字符被正确地认为是有效的utf8。
更新 :现在这个工作在JXcore中
正如Josh C.上面所说:“npmjs.org/package/encoding”
从npm网站:“编码是一个简单的包装节点,iconv和iconv-lite转换string从一个编码到另一个”。
下载: $ npm install encoding
用法示例
var result = encoding.convert(new Buffer([ 128 ], 'binary'), "utf8"); console.log(result); //<Buffer 80>
访问网站: npm – 编码