python - 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
?
解决方案
在 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')
'Ω'
推荐阅读
- firebase-realtime-database - Glide 图像是磁盘,内存缓存,但 firebase 实时下载正在增加
- preventdefault - 有谁知道如何在 agora.io 中默认启用全屏扩展?(新手先发帖)
- kubernetes - Kubernetes CronJob 未退出
- c++ - 有没有办法让这个暴力密码破解器更快?
- jnlp - Load Runner VuGen 未使用 FSAL 捕获 Oracle 表单流量
- .net - 无法加载文件或程序集“CrystalDecisions.ReportAppServer.ClientDoc,
- typescript - 反应原生 Typescript Touchableopacity 道具错误
- javascript - Fabric js 对象在所有屏幕上都有响应
- amazon-web-services - 如何使用结构化模式在 AWS CloudSearch 上搜索子字符串
- json - 尝试将自定义有效负载消息传递给 sqs - kinesis 完成后的死信队列在 lambda 中重试 3 次