Python深入-4-Unicode文本与字符序列

一、字符问题

字符串”是个相当简单的概念:一个字符串就是一个字符序列。问题出在“字符”的定义上。
在 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。
bytesbytearray中的项是 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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!