【问题标题】:How to validate that a string is a valid UTF-8 string in python 2.7如何在 python 2.7 中验证字符串是有效的 UTF-8 字符串
【发布时间】: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 字符串?

【问题讨论】:

    标签: python string postgresql 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% 的情况)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2012-12-23
    • 2013-08-16
    • 2019-11-15
    相关资源
    最近更新 更多