- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
4.10 本章小结
本章首先澄清了人们对一个字符等于一个字节的误解。随着 Unicode 的广泛使用(80% 的网站已经使用 UTF-8),我们必须把文本字符串与它们在文件中的二进制序列表述区分开,而 Python 3 中这个区分是强制的。
对 bytes、bytearray 和 memoryview 等二进制序列数据类型做了简要概述之后,我们转到了编码和解码话题,通过示例展示了重要的编解码器;随后讨论了如何避免和处理臭名昭著的 UnicodeEncodeError 和 UnicodeDecodeError,以及由于 Python 源码文件编码错误导致的 SyntaxError。
讨论源码的编码问题时,我表明了自己对非 ASCII 标识符的观点:如果代码基的维护者想使用包含非 ASCII 字符的人类语言命名标识符,那就去做,除非还想在 Python 2 中运行代码。但是,如果项目想吸引世界各国的贡献者,那么标识符应该使用英语单词,此时 ASCII 就够用了。
然后,我们说明了在没有元数据的情况下检测编码的理论和实际情况:理论上,做不到这一点;但是实际上,Chardet 包能够正确处理一些流行的编码。随后介绍了字节序标记,这是 UTF-16 和 UTF-32 文件中常见的编码提示,某些 UTF-8 文件中也有。
随后的一节演示了如何打开文本文件,这是一项简单的任务,不过有个陷阱:打开文本文件时,encoding= 关键字参数不是必需的,但是应该指定。如果没有指定编码,那么程序会想方设法生成“纯文本”,如此一来,不一致的默认编码就会导致跨平台不兼容性。然后,我们说明了 Python 用作默认值的几个编码设置,以及如何检测它们:locale.getpreferredencoding()、sys.getfilesystemencoding()、sys.getdefaultencoding(),以及标准 I/O 文件(如 sys.stdout.encoding)的编码。对 Windows 用户来说,现实不容乐观:这些设置在同一台设备中往往有不同的值,而且各个设置相互不兼容。而对 GNU/ Linux 和 OS X 用户来说,情况就好多了,几乎所有地方使用的默认值都是 UTF-8。
文本比较是个异常复杂的任务,因为 Unicode 为某些字符提供了不同的表示,所以匹配文本之前一定要先规范化。说明规范化和大小写折叠之后,我们提供了几个实用函数,你可以根据自己的需求改编。其中有个函数所做的是极端转换,比如去掉所有重音符号。随后,我们说明了如何使用标准库中的 locale 模块正确地排序 Unicode 文本(有一些注意事项);此外,还可以使用外部的 PyUCA 包,从而无需依赖捉摸不定的区域配置。
最后简要介绍了 Unicode 数据库(包含每个字符的元数据),还简单讨论了双模式 API(例如 re 和 os 模块,这两个模块中的某些函数可以接受字符串或字节序列参数,返回不同但合适的结果)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论