【问题标题】:encoding unicode using UTF-8使用 UTF-8 编码 unicode
【发布时间】:2016-04-01 07:18:26
【问题描述】:

在 Python 中,如果我键入

euro = u'\u20AC'
euroUTF8 = euro.encode('utf-8')
print(euroUTF8, type(euroUTF8), len(euroUTF8))

输出是

('\xe2\x82\xac', <type 'str'>, 3)

我有两个问题: 1. 看起来 euroUTF8 编码超过 3 个字节,但我如何获得它的二进制表示以查看它包含多少位? 2.'\xe2\x82\xac'中的'x'是什么意思?我不认为'x' 是一个十六进制数字。为什么会有三个'\'

【问题讨论】:

    标签: python unicode utf-8 encode


    【解决方案1】:

    在 Python 2 中,print 是一个语句,而不是一个函数。你在这里打印一个 tuple。通过删除(..) 打印单个元素:

    >>> euro = u'\u20AC'
    >>> euroUTF8 = euro.encode('utf-8')
    >>> print euroUTF8, type(euroUTF8), len(euroUTF8)
    € <type 'str'> 3
    

    现在您将 3 个单独的对象作为字符串写入标准输出;我的终端恰好被配置为将写入它的任何内容解释为 UTF-8,因此字节正确导致显示 Euro 符号。

    \x&lt;hh&gt; 序列是Python 字符串文字转义序列(参见reference documentation);它们是 repr() 的默认输出,应用于其中包含非 ASCII、不可打印字节的字符串。在交互式解释器中回显值时,您会看到同样的情况:

    >>> euroUTF8
    '\xe2\x82\xac'
    >>> euroUTF8[0]
    '\xe2'
    >>> euroUTF8[1]
    '\x82'
    >>> euroUTF8[2]
    '\xac'
    

    它们为您提供 ASCII 安全的调试输出。所有 Python 标准库容器的内容都使用这种格式;包括列表、元组和字典。

    如果要格式化以查看构成这些值的位,请使用 ord() 函数将每个字节转换为整数,然后将整数格式化为二进制:

    >>> ' '.join([format(ord(b), '08b') for b in euroUTF8])
    '11100010 10000010 10101100'
    

    【讨论】:

      【解决方案2】:
      1. 每种编码中的每个字母都使用不同的位数表示。 UTF-8 是一种 8 位编码,因此无需获取二进制表示即可知道每个字符的每个位数。 (如果您仍想展示位,请参阅 Martijn 的回答。)

      2. \x 表示后面的值是一个字节。所以 x 不是你应该转换或读取的十六进制数字。它标识了您感兴趣的以下值。\ 用于转义 x,因为它们不是值的一部分。

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 1970-01-01
        • 2014-02-18
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        相关资源
        最近更新 更多