【问题标题】:Python unicode string with UTF-8?带有UTF-8的Python unicode字符串?
【发布时间】:2021-08-13 17:27:21
【问题描述】:

我从图书馆回来,似乎是一个不正确的 unicode 字符串:

>>> title
u'Sopet\xc3\xb3n'

现在,这两个十六进制转义是 U+00F3 LATIN SMALL LETTER O WITH ACUTE 的 UTF-8 编码。据我了解,Python 中的 unicode 字符串应该具有实际字符,而不是字符的 UTF-8 编码,所以我认为这是不正确的,可能是库或我的输入中的错误,对吧?

问题是,我如何 (a) 识别我的 unicode 字符串中有 UTF-8 编码的文本,以及 (b) 将其转换为正确的 unicode 字符串?

我对 (a) 感到困惑,因为在编码方面,关于原始字符串没有任何问题(即,两者本身都是有效字符,u'\xc3\xb3' == ó,但它们不是什么应该在那里)

看起来我可以通过 eval() 将 repr() 输出减去前面的“u”得到​​一个 str,然后用 UTF-8 解码 str 来实现 (b):

>>> eval(repr(title)[1:]).decode("utf-8")
u'Sopet\xf3n'
>>> print eval(repr(title)[1:]).decode("utf-8")
Sopetón

但这似乎有点笨拙。是否有官方认可的方法可以从 unicode 字符串中获取原始数据并将其视为常规字符串?

【问题讨论】:

    标签: python unicode


    【解决方案1】:

    你应该使用:

    >>> title.encode('raw_unicode_escape')
    

    Python2:

    print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape'))
    

    Python3:

    print(u'\xd0\xbf\xd1\x80\xd0\xb8'.encode('raw_unicode_escape').decode('utf8'))
    

    【讨论】:

    • 你拯救了我的一天。我有一个内部带有 utf-8 字节的 unicode 对象,并且必须将其解码回“正常”的 unicode。这为我解决了这个问题:my_str.encode('raw_unicode_escape').decode('utf-8')。我认为这是一个比公认答案更通用的解决方案,因为它不仅可以解码“latin-1”范围内的字符串。谢谢! :)
    【解决方案2】:

    a) 试试下面的方法。

    b)

    >>> u'Sopet\xc3\xb3n'.encode('latin-1').decode('utf-8')
    u'Sopet\xf3n'
    

    【讨论】:

    • 注1)没有通用的方式来识别utf-8;这将识别它,因为 UTF-8 解码器将检查它给出的所有多字节序列是否有效,如果有任何不正确,则会引发异常,2) encode-to-Latin-1 技巧有效,因为您的代码点都小于 256,Unicode 的代码点 0-255 完全对应 Latin-1 的表示。
    • 我不确定我是否完全理解您的评论。也许一个具体的反例会有所帮助。据我了解,“.encode('latin-1')”是一个无操作,除了结果是 str 而不是 unicode。是否有一个字符串不会出现这种情况?我同意不会有一种通用的方法来检测 unicode 字符串中的 UTF-8,因为 UTF-8 编码的字节将在 unicode 字符串中具有有效(如果不正确)的解释。就我的目的而言,我真的只对 latin-1 感兴趣(目前),所以这就足够了。
    • @Watts: u'\u03b5\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac means greek'.encode('latin1')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2019-12-02
    • 1970-01-01
    • 2010-09-21
    • 2019-03-08
    • 2021-12-12
    相关资源
    最近更新 更多