如何在node.js中捕获utf-8解码错误?

我刚刚发现Node(testing:v0.8.23,当前git:v0.11.3-pre) 忽略了其缓冲区处理中的任何解码错误 ,用'\ufffd' (Unicodereplace字符)静默地replace了任何非utf8字符,而不是抛出关于非utf8input的exception。 因此, fs.readFileprocess.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 – 编码