[英]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'
每种编码中的每个字母都使用不同的位数表示。 UTF-8 是 8 位编码,因此无需获取二进制表示即可了解每个字符的每个位计数。 (如果您仍想呈现位,请参阅 Martijn 的回答。)
\\x
表示后面的值是一个字节。 所以 x 不是你应该转换或读取的十六进制数字。 它标识了您感兴趣的以下值。 \\
用于转义x
,因为它们不是值的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.