在Javascript中检查字节序列是否是有效的UTF-8序列

5

有没有一种简单的方法在JavaScript中检查字符串是否是有效的UTF-8序列?

我真的不想以这样的正则表达式结束:

检测无效UTF-8字符串的正则表达式

附言:我从外部API接收数据,有时(非常少但确实会发生)返回带有无效UTF-8序列的数据。试图将它们放入PostgreSQL中会导致适当的错误。


1
我不认为那样说有任何意义。一个字符串是由字符组成的列表。UTF-8是一种用二进制格式表示字符的方法。字符串本身并没有编码。 - njzk2
除非您正在尝试确定一个字符串是否可以完全使用UTF-8编码表示? - njzk2
检查有效的UTF8的唯一方法是检查它是否包含无效的UTF8字符。您提供的正则表达式是执行此检查的一种有效、简洁和高效的方式。当然,您也可以按照自己的字典以自定义的方式进行检查。 - PA.
1
我不知道是否有任何内置方法,所以上次我需要时,我使用了 text.match(/[\x80-\xFF]+/) 来收集潜在问题,并针对UTF-8规范检查每个匹配项——共计52行代码。实际上,使用该正则表达式是一种相当巧妙、快速和简单的方式。 - Jongware
我正在从API接收数据,有时(非常罕见但确实会发生)它返回带有无效的utf-8序列的数据。试图将它们放入Postgres中会导致适当的错误。 - zavg
2
你是否正在尝试弄清楚一系列字节是否可以解释为 UTF-8 编码的字符串? - njzk2
1个回答

5
UTF-8实际上是一种简单的编码方式,但你所要求的无法通过一行代码实现。你需要:
  1. 覆盖响应的Content-Type以在脚本中获取字节数组,并防止浏览器/库解释响应
  2. 循环遍历字节以生成字符。请注意,UTF-8是一种可变长度编码,这就是为什么某些序列无效的原因。
  3. 如果找到无效的八位组,则跳过它
  4. 如果需要,将JSON/XML/任何字符串反序列化为JavaScript对象,可能需要处理失败情况
判断某个数组是否为有效的UTF-8序列是相当简单的任务(只需一堆if语句和位移操作),但同样不是一行代码的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接