如何在 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 2.7 中计算 TF-IDF(三行代码)。这段代码有效吗?