第 37 章 统一码和字节字符串 统一码和字节字符串
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
到目前为止,我们在本书中对字符串的探索是故意不完整的。第 4 章的类型预览简要介绍了 Python 的 Unicode 字符串和文件,但没有给出很多细节,而本书核心类型部分(第 7 章) 的字符串章节也刻意将其范围限制在大多数 Python 程序员需要了解的字符串主题子集上。
这是设计好的:因为许多程序员,包括大多数初学者,处理的都是像 ASCII 这样的简单文本形式,他们可以愉快地使用 Python 的基本str 字符串类型及其相关操作,而不需要掌握更高级的字符串概念。事实上,这样的程序员通常可以忽略 Python 3.X 中字符串的变化,继续像过去那样使用字符串。
另一方面,许多其他程序员会处理更特殊的数据类型:非 ASCII 字符集、图像文件内容,等等。对于这些程序员,以及将来可能加入他们行列的其他程序员,我们将在本章介绍 Python 字符串故事的其余部分,并了解 Python 字符串模型中一些更高级的概念。
具体来说,我们将探索 Python 对Unicode 文本的基本支持--国际化应用程序中使用的丰富字符串,以及二进制数据--表示绝对字节值的字符串。正如我们将看到的,高级字符串表示法在最近的 Python 版本中出现了分化:
Python 3.X为二进制数据提供了另一种字符串类型,并在其普通字符串类型中支持 Unicode 文本 (包括 ASCII)。
Python 2.X为非 ASCII Unicode 文本提供了另一种字符串类型,并在其普通字符串类型中同时支持简单文本和二进制数据。
此外,由于 Python 的字符串模型对如何处理非 ASCII文件有直接影响,我们也将在这里探讨该相关主题的基础知识。最后,我们将简要介绍一些高级字符串和二进制工具,如模式匹配、对象提取、二进制数据打包和 XML 解析,以及它们受 3.X 字符串变化影响的方式。
本章是正式的高级主题章节,因为并非所有程序员都需要深入了解 Unicode 编码或二进制数据的世界。对于某些读者来说,第 4 章的预览可能就足够了,而其他读者则可能希望将本章归档以备将来参考。不过,如果您需要处理这两种数据,您会发现 Python 的字符串模型提供了所需的支持。
字符串在 3.X 中的变化
Python 3.X 系列最明显的变化之一是字符串对象类型的突变。简而言之,2.X 的str 和unicode 类型已演变成 3.X 的bytes 和str类型,并添加了一个新的可变bytearray 类型。从技术上讲,Python 2.6 和 2.7 中也有bytearray 类型 (但不是更早的版本),但它是从 3.X 移植过来的,在 2.X 中并不能清楚地区分文本和二进制内容。
特别是如果您处理的数据是 Unicode 或二进制数据,这些变化会对您的代码产生重大影响。一般来说,您需要关心这个问题的程度在很大程度上取决于您属于以下哪种类型:
如果您要处理非 ASCIIUnicode 文本--例如,在网络等国际化域中,或者在某些 XML 和 JSON 解析器及数据库的结果中--您会发现 3.X 中对文本编码的支持有所不同,但也可能比 2.X 中更直接、更易访问、更无缝。
如果您要处理二进制数据,例如图像或音频文件,或使用
struct模块处理的打包数据,您就需要了解 3.X 的新bytes对象,以及 3.X 在文本和二进制数据及文件之间更清晰的区别。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access