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

时间:2013-06-09 05:39:10

标签: node.js utf-8 error-handling npm utf8-decode

我刚刚在其缓冲区处理中发现了Node(已测试:v0.8.23,当前git:v0.11.3-pre)ignores any decoding errors,用'\ufffd'静默替换任何非utf8字符(Unicode替换CHARACTER)而不是抛出关于非utf8输入的异常。因此,fs.readFileprocess.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解码错误,最好是关于输入字符串或缓冲区中发现错误的位置的上下文?

3 个答案:

答案 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