当前位置: 首页 > 面试题库 >

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

孟翰藻
2023-03-14
问题内容

我刚刚发现Node(已测试:v0.8.23,当前git:v0.11.3-pre)在其Buffer处理中忽略了任何解码错误,以'\ufffd'(Unicode
REPLACEMENT
CHARACTER)静默替换了任何非utf8字符,而不是抛出html" target="_blank">异常非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中可能出现的完全有效的字符(作为sequence ef bf bd),因此根据结果显示出来,对猴子补丁进行错误处理并不容易。

深入研究,看来这是由于节点只是顺应v8的字符串而来,而这些反过来又具有上述行为,v8没有任何外部世界充满外来编码数据。

是否有节点模块或其他让我捕获utf-8解码错误的模块,最好与上下文有关在输入字符串或缓冲区中发现错误的位置有关?


问题答案:

从节点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



 类似资料:
  • 问题内容: 如何在我的API上获得UTF-8支持?此刻,一个字符串输出如下: 代替: 在以下结帐app.js: 问题答案: 连接到响应生成器或创建执行以下操作的中间件: 否则,浏览器将以他喜欢的编码显示内容。 如果这不能帮助您,则DB可能编码错误。 编辑: 由于答案将近5年,API已更改。对于当前的node.js版本,请使用:

  • 我正在从可能被压缩的服务器下载内容,所以我使用了我在不同地方找到的样板: 问题是,如果HTTPS请求因网络错误而失败,我有时会引发以下异常: 该“错误”事件处理程序未捕获异常。那么我如何捕获它,以便能够正确地清理文件并知道如何重试?

  • 作为Python的新手,我已经花了很多时间。 我怎么能解码这样的URL: 到python 2.7中的这个: 返回的内容非常难看。 仍然没有解决办法,任何帮助都是感激的。

  • 问题内容: 最近,我们将应用程序从JDK 7迁移到了JDK8。更改之后,我们遇到了以下代码段的问题。 字节数组可能包含无效的UTF-8字节序列。UTF-8解码时,相同的字节数组在Java 7和Java 8上产生两个不同的字符串。 根据此SO帖子的答案,Java 8“修复”了Java7中的错误,并用替换字符串替换了无效的UTF-8字节序列,该字符串符合UTF-8规范。 但是我们想坚持使用Java 7

  • 问题内容: 如何使用Android解码utf-8字符串?我尝试使用此命令,但输出与输入相同: 问题答案: 字符串不需要编码。它只是一个Unicode字符序列。 要将字符串转换为字节序列时需要进行 编码 。您选择的字符集(UTF-8,cp1255等)确定了Character-> Byte映射。请注意,字符不必转换为单个字节。在大多数字符集中,大多数Unicode字符都转换为至少两个字节。 字符串的编

  • 问题内容: 就我是Python的新手而言,我已经花了很多时间。 我怎么能解码这样的URL: 到python 2.7中的这个: 返回的东西非常丑陋。 仍然没有解决方案,我们将提供任何帮助。 问题答案: 数据是使用URL引号进行转义的UTF-8编码字节,因此,您想使用进行 解码 ,使用来处理从百分比编码的数据到UTF-8字节然后再透明地转换为文本的解码: 演示: Python 2等效于,但是它返回一个