如何在 python 2.7 中验证字符串是有效的 UTF-8 字符串

Posted

技术标签:

【中文标题】如何在 python 2.7 中验证字符串是有效的 UTF-8 字符串【英文标题】:How to validate that a string is a valid UTF-8 string in python 2.7 【发布时间】:2021-02-14 23:48:18 【问题描述】:

我有以下字符串 -

"\xed\xad\x80\xed\xb1\x93"

当使用此字符串在 PostgreSQL 数据库中执行查询时,会引发以下错误 -

DataError: invalid byte sequence for encoding "UTF8": 0xed 0xad 0x80

在 python 2.7 中测试它时(在执行查询之前)它不会引发异常 -

Windows 测试 -

'\xed\xad\x80\xed\xb1\x93'.decode("utf-8")
u'\U000e0053'

Linux 测试-

'\xed\xad\x80\xed\xb1\x93'.decode("utf-8")
u'\udb40\udc53'

在python3中,它实际上引发了一个异常-

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xed in position 0: invalid continuation byte

如何在 python 2.7 中检查它不是 有效的 utf-8 字符串?

【问题讨论】:

【参考方案1】:

它是一个有效的 UTF-8 代码,但它不属于一个字符。

0xEDAD80 转换为 UNICODE 代码点 DB40,它是“high surrogate”,而不是这样的字符。

所以这些数据不是 UTF-8 编码的字符。用 UTF-8 编码代理是没有意义的,它们通常用于 UTF-16 和 UCS-2 等编码。

RFC 3629 实际上声明不允许编码代理:

UTF-8 的定义禁止编码字符之间的数字 U+D800 和 U+DFFF,保留用于 UTF-16 编码形式(作为代理对)并且不直接表示 字符。

这听起来像是 Python v2 中的一个错误,您可以这样报告。

【讨论】:

是的.. 但是如果 python 2.7 真的不是 utf-8,我该如何检查它? 不知道。但是你标记了 PostgreSQL,所以我认为解释发生了什么可能很有用。 @LaurenzAlbe:因为 RFC 3629 编码单个代理一半在 UTF-8 中不再有效。它实际上是无效的。 @JoachimSauer 感谢您提供的信息,这使得这是一个 Python 错误。 注意:Python3 有“surrogateescape”:它只是使用代理代码点来编码非 Unicode 数据。所以Python2.7可能也是这样。注意:这是一种特殊情况,很少使用(如果没有其他方法,例如在“字符串”上您可能会收到原始字节,如 sys.argv 和系统环境(真正的解码可能会丢失一些重要信息,但如果我们可以处理为文本,那很好,对于 99.99% 的情况)

以上是关于如何在 python 2.7 中验证字符串是有效的 UTF-8 字符串的主要内容,如果未能解决你的问题,请参考以下文章

有效地将字符串转换为 python 2.7 的 unicode

python使用有效负载和公钥字符串验证数字签名

在 python 2.7 中计算 TF-IDF(三行代码)。这段代码有效吗?

Python 2.7 Tkinter标签虽然有效但未显示

如何使用 Python 2.7 在 Windows 上修复 pip 安装证书问题? [复制]

如何检查 mongo ObjectID 在 python 中是不是有效?