繁体   English   中英

使用 UTF-8 编码 unicode

[英]encoding unicode using UTF-8

在 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' '\\xe2\\x82\\xac'是什么意思? 我不认为'x'是一个十六进制数。 为什么有三个'\\'

在 Python 2 中, print是一个语句,而不是一个函数。 您正在此处打印一个元组 通过删除(..)打印各个元素:

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

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

\\x<hh>序列是Python 字符串文字转义序列(请参阅参考文档); 它们是应用于包含非 ASCII、不可打印字节的字符串的repr()的默认输出。 在交互式解释器中回显值时,您将看到相同的内容:

>>> 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'
  1. 每种编码中的每个字母都使用不同的位数表示。 UTF-8 是 8 位编码,因此无需获取二进制表示即可了解每个字符的每个位计数。 (如果您仍想呈现位,请参阅 Martijn 的回答。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM