【问题标题】:How to check if a Node.js `Buffer` contains valid UTF-8?如何检查 Node.js `Buffer` 是否包含有效的 UTF-8?
【发布时间】:2023-01-13 19:39:55
【问题描述】:

我有一个 Buffer 对象,我想检查它是否全部都是有效的 UTF-8。理想情况下,我也想获得带有所述已解码 UTF-8 文本的 string

我试过Buffer.toString,它接受一个默认为utf8encoding参数。不幸的是,文档是这样说的:

如果 encoding'utf8' 并且输入中的字节序列不是有效的 UTF-8,则每个无效字节都将替换为替换字符 U+FFFD

那不是我想要的:我更想要一个异常或一个布尔标志。只是检查结果字符串是否包含 U+FFFD 与输入文本可能已经包含 U+FFFD 不同(就像一个有效的 Unicode 代码点)。当然,可以尝试在缓冲区和字符串中计算 U+FFFD,然后进行比较,但这似乎毫无用处,而且效率低下。

有没有更好的办法?

【问题讨论】:

    标签: javascript node.js utf-8


    【解决方案1】:

    您可以使用 util 中的 TextDecoder。要获得异常,请将 fatal 标志设置为 true

    new TextDecoder("utf8", { fatal: true }).decode(buffer)
    

    例如:

    > new TextDecoder("utf8", { fatal: true }).decode(Buffer.from([72, 195, 182, 240, 159, 146, 154, 215, 169, 214, 184, 215, 129]))
    'Hö?שָׁ'
    
    > new TextDecoder("utf8", { fatal: true }).decode(Buffer.from([1, 2, 255, 3, 5]))
    Uncaught:
    TypeError [ERR_ENCODING_INVALID_ENCODED_DATA]: The encoded data was not valid for encoding utf-8
        at __node_internal_captureLargerStackTrace (node:internal/errors:478:5)
        at new NodeError (node:internal/errors:387:5)
        at TextDecoder.decode (node:internal/encoding:433:15) {
      errno: 12,
      code: 'ERR_ENCODING_INVALID_ENCODED_DATA'
    

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2016-05-23
      • 2018-09-03
      • 2016-07-18
      • 1970-01-01
      • 2013-08-16
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多