如何检查Node.js 'Buffer'是否包含有效的UTF-8?

xurqigkl  于 2023-01-16  发布在  Node.js
关注(0)|答案(1)|浏览(147)

我有一个Buffer对象,我想检查它是否都是有效的UTF-8。理想情况下,我也想得到一个带有解码的UTF-8文本的string
我尝试了Buffer.toString,它接受一个encoding参数,默认为utf8。不幸的是,文档是这样说的:
如果encoding'utf8',并且输入中的字节序列不是有效的UTF-8,则每个无效字节都被替换字符U+FFFD替换。
这不是我想要的我更希望有一个异常或布尔标记,只是检查结果字符串是否包含U+FFFD,而输入文本可能已经包含了U+FFFD(就像一个有效的Unicode码点一样),当然可以尝试计算缓冲区和字符串中的U+FFFD,然后进行比较,但这似乎是无用的复杂和低效。
有更好的办法吗?

5ssjco0h

5ssjco0h1#

您可以从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'

相关问题