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在其 Buffer 处理中,用 '\ufffd'(Unicode REPLACEMENT CHARACTER)默默地替换任何非 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),因此它对 monkey-基于结果中显示的错误处理补丁。

再深入一点,看起来这源于 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/18564123/

相关文章:

javascript - 如何在 NodeJS 中生成像 facebook、google+ 这样的唯一 ID

mysql - 不区分重音的搜索/utf8_general_ci 排序规则问题

c++ - iconv() - 如何确定输出缓冲区所需的大小?

php - 迭代了一个错误,但几乎完全成功了array_combine : Warning: array_combine() expects parameter 2 to be array, boolean

javascript - 如何处理 statusCode 未处理的 ajax 错误?

mysql - 在 MySQL 数据库中存储一系列 0 和 1

Node.js Redis 异步问题

php - 运行时通知 : Declaration of in symfony2

node.js - 如何使用 websockets 制作一个 crud 应用程序?

ruby-on-rails - ruby 将 "\x\x"格式编码为 utf8 字符串或以当前形式存储在 rails postgres db 中