首页 > 解决方案 > python中的字符和字节

问题描述

在阅读本教程时,我遇到了__unicode____str__方法之间的以下区别:

由于这种差异,在 Python 2 中还有另一种用于控制字符串转换的 dunder 方法:__unicode__. 在 Python 2 中,__str__返回字节,而__unicode__返回字符。

这里究竟如何定义“字符”和“字节”?例如,在 C 中,一个 char 是一个字节,那么 char 不是一个字节吗?或者,这是指(可能)Unicode 字符,可能是多个字节?例如,如果我们采取以下措施:

Ω (omega symbol)
03 A9 or u'\u03a9'

在python中,这会被认为是一个字符(Ω)和两个字节,还是两个字符(03 A9)和两个字节?或者也许我混淆了char和之间的区别character

标签: pythonunicodebytecpython

解决方案


在 Python 中,u'\u03a9'是由单个Unicode 字符Ω(U+03A9) 组成的字符串。该字符串的内部表示是一个实现细节,因此询问所涉及的字节是没有意义的。

歧义的一个来源是类似 的字符串'é',它可以是单个字符 U+00E9 或两个字符的字符串 U+0065 U+0301。

>>> len(u'\u00e9'); print(u'\u00e9')
1
é
>>> len(u'\u0065\u0301'); print(u'\u0065\u0301')
2
é

然而,两字节序列'\xce\xa9'可以解释为 U+03A9 的 UTF-8 编码。

>>> u'\u03a9'.encode('utf-8')
'\xce\xa9'

>>> '\xce\xa9'.decode('utf-8')
u'\u03a9'

在 Python 3 中,这将是(UTF-8 是默认编码方案)

>>> '\u03a9'.encode()
b'\xce\xa9'
>>> b'\xce\xa9'.decode()
'Ω'

其他字节序列也可以解码为 U+03A9:

>>> b'\xff\xfe\xa9\x03'.decode('utf16')
'Ω'
>>> b'\xff\xfe\x00\x00\xa9\x03\x00\x00'.decode('utf32')
'Ω'

推荐阅读