一、字符问题
字符串”是个相当简单的概念:一个字符串就是一个字符序列。问题出在“字符”的定义上。
在 2021 年,“字符”的最佳定义是 Unicode 字符。因此,从 Python 3 的 str 对象中获取的项是 Unicode 字符,从 Python 2 的 unicode 对象中获取的项也是 Unicode 字符,而从 Python 2 的 str 对象中获取的项是原始字节序列。
编码:把码点转换成字节序列的过程叫编码。
-
而把字符串变成用于存储或传输的字节序列是编码
解码:把字节序列转换成码点的过程叫解码。
-
把字节序列变成人类可读的字符串是解码
s = "china"
print(len(s))
# 使用 UTF-8 把 str 对象编码成 bytes 对象。bytes 字面量以 b 开头。
b = s.encode('utf8')
print(b) # b'china'
# 使用 UTF-8 把 bytes 对象解码成 str 对象
print(b.decode('utf8')) # china
注意:虽然 Python 3 的 str 类型基本相当于 Python 2 的 unicode 类型,只不过换了个新名称而已,但是 Python3 的 bytes 类型并不是把 str 类型换个名称那么简单,而且还有关系紧密的 bytearray 类型。
二、字节概要
新的二进制序列类型在很多方面与 Python 2 的 str 类型不同。首先要知道,Python 内置两种基本的二进制序列类型:Python 3 引入的不可变类型 bytes 和 Python 2.6 添加的可变类型 bytearray。bytes
和bytearray
中的项是 0~255(含)的整数,而不像 Python 2 的 str 对象那样是单个字符。然而,二进制序列的切片始终是同一类型的二进制序列,包括长度为 1 的切片;代码如下:
# 指定编码,可以根据 str 对象构建 bytes 对象。
cafe = bytes('café', encoding='utf_8')
print(cafe) # b'cafxc3xa9'
# 各项是 range(256) 内的整数。
print(cafe[0]) # 99
# bytes 对象的切片还是 bytes 对象,即使是只有一个字节的切片
print(cafe[:1]) # b'c'
cafe_arr = bytearray(cafe)
# bytearray 对象没有字面量句法,显示为 bytearray() 调用形式,参数是一个 bytes 字面量。
print(cafe_arr) # bytearray(b'cafxc3xa9')
# bytearray 对象的切片也还是 bytearray 对象。
print(cafe_arr[-1:]) # bytearray(b'xa9')
注意:
my_bytes[0]
获取的是一个整数,而my_bytes[:1]
返回的是一个长度为 1 的字节序列。
对str
类型来说,s[0] == s[:1]
。除此之外,对于 Python 中的其他所有序列类型,一个项不能等同于长度为 1 的切片。
二进制序列有一个类方法是 str 没有的,名为 fromhex
,它的作用是解析十六进制数字对(数字对之间的空格是可选的),构建二进制序列。
print(bytes.fromhex('31 4B CE A9')) # b'1Kxcexa9'
构建 bytes 或 bytearray 实例还可以调用各自的构造函数,传入以下参数。
-
一个 str 对象和 encoding 关键字参数。
-
一个可迭代对象,项为 0~255 范围内的数。
-
一个实现了缓冲协议的对象(例如 bytes、bytearray、memoryview、array.array)。构造函数把源对象中的字节序列复制到新创建的二进制序列中。
三、基本的编码解码器
Python 自带超过 100 种编码解码器(codec,encoder/decoder),用于在文本和字节之间相互转换。每种编码解码器都有一个名称,例如utf_8,而且经常有几个别名,例如 utf8、utf-8和 U8。这些名称可以传给open()、str.encode()、bytes.decode() 等函数的encoding参数。
原文始发于微信公众号(Python之家):Python深入-4-Unicode文本与字符序列
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/198414.html