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

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

我刚刚发现 Node(测试:v0.8.23,当前 git:v0.11.3-pre)ignores any decoding errors在其缓冲区处理中,用 '\ufffd' (Unicode 替换字符)默默地替换任何非 utf8 字符,而不是抛出关于非 utf8 输入的异常。结果,fs.readFileprocess.stdin.setEncoding 和 friend 们为你掩盖了一大类错误的输入错误。

不会失败但确实应该失败的示例:

> notValidUTF8 = new Buffer([ 128 ], 'binary')
<Buffer 80>
> decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here!
'�'
> decodedAsUTF8 === '\ufffd'
true

'\ufffd' 是一个完全有效的字符,可以出现在合法的 utf8 中(作为序列 ef bf bd),所以它对猴子来说不是微不足道的——基于结果中显示的错误处理补丁。

再深入一点,看起来这源于 Node 只是遵循 v8 的字符串,而这些字符串又具有上述行为,v8 没有任何外部世界充满外来编码数据。

是否有 Node 模块或其他方式可以让我捕捉 utf-8 解码错误,最好是在输入字符串或缓冲区中发现错误的上下文?

最佳答案

希望你解决了那些年的问题,我也遇到过类似的问题,最终用这个丑陋的伎俩解决了:

  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

关于node.js - 如何在 node.js 中捕获 utf-8 解码错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17006799/

相关文章:

shell - shell VAR = $(command)处理可能的错误

c# - 我的C#代码有什么问题?

javascript - 如何重构 switch 案例以调用类中的方法?

python - 如何在Python中正确错误检查JSON值?

node.js - Redis pubsub 消息队列,但有回调,就像在 ZeroMQ 中一样

jsp - 显示非英文字符 ??在 Action 类

mysql - VB.NET、MySQL 和 Unicode

php - 使用 UTF-8 时某些字符无法显示

node.js - 解决对象中的所有 promise

javascript - 在 javascript/node js 中使用 regExp 拆分字符串并获取数组