【问题标题】:Working with unicode in python在 python 中使用 unicode
【发布时间】:2012-06-25 20:02:01
【问题描述】:

我使用 pymysql 连接到 mysql 数据库,执行请求后得到以下字符串:\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0

这应该是 utf8 中的 5 个字符,但是当我使用 print s.encode('utf-8') 时,我得到了:╨╝╨░╤А╨║╨░。该字符串看起来像 unicode 字符的字节表示,python 无法识别。

那么我该怎么做才能让python正确处理它们呢?

【问题讨论】:

    标签: python utf-8 encode


    【解决方案1】:

    你想decode(不是encode)从一个字节串中得到一个unicode串。

    >>> s = '\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0'
    >>> us = s.decode('utf-8')
    >>> print us
    марка
    

    请注意,您可能无法print 它,因为它包含 ASCII 以外的字符。但是您应该能够在支持 Unicode 的调试器中看到它的值。我在 IDLE 中运行了上述内容。

    更新

    看来你实际拥有的是这样的:

    >>> s = u'\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0'
    

    这比较棘手,因为在调用decode 之前,您首先必须将这些字节转换为字节串。我不确定这样做的“最佳”方法是什么,但这很有效:

    >>> us = ''.join(chr(ord(c)) for c in s).decode('utf-8')
    >>> print us
    марка
    

    请注意,您当然应该在将其作为字符串存储在数据库中之前对其进行解码。

    【讨论】:

    • 谢谢。当我尝试解码时,我收到一条错误消息:“UnicodeEncodeError:'ascii' 编解码器无法对位置 0-9 中的字符进行编码:序数不在范围内(128)”。一定是因为字符串被表示为u\xd0\xbc\xd0\xb0\xd1\x80\xd0\xba\xd0\xb0
    • print s.encode('latin1').decode('utf8') 也为我工作。
    【解决方案2】:

    Mark 是对的:您需要对字符串进行解码。字节字符串通过解码成为 Unicode 字符串,编码则相反。这个和许多其他细节都在Pragmatic Unicode, or, How Do I Stop The Pain?

    【讨论】:

    • 我过去曾犯过这个错误 - 只是试着记住一个“解码”字节,但“编码”文本。
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2014-12-21
    • 2013-11-14
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多