PEP 3120 – 使用 UTF-8 作为默认源编码
- 作者:
- Martin von Löwis <martin at v.loewis.de>
- 状态:
- 最终
- 类型:
- 标准跟踪
- 创建:
- 2007年4月15日
- Python 版本:
- 3.0
- 历史记录:
规范
本 PEP 提案将默认源编码从 ASCII 更改为 UTF-8。对备用源编码的支持(PEP 263)继续存在;显式编码声明优先于默认值。
一点历史
在 Python 1 中,源编码未指定,但源编码必须是系统基本执行字符集的超集(即在大多数系统上是 ASCII 超集)。源编码仅与词法本身相关(表示关键字、标识符、标点符号、换行符等的字节)。字符串字面量的内容从源文件逐字复制。
在 Python 2.0 中,源编码更改为 Latin-1,这是引入 Unicode 的副作用。对于 Unicode 字符串字面量,字符仍然从源文件逐字复制,但逐字符扩展。由于 Unicode 对代码点赋予固定解释,因此该算法有效地固定了源编码,至少对于在 Unicode 字面量中包含非 ASCII 字符的文件而言。
PEP 263 确定了您只能在 Unicode 字面量中使用也属于 Latin-1 的 Unicode 字符的问题,并引入了用于声明源编码的语法。如果未提供源编码,则默认值应为 ASCII。为了与 Python 2.0 和 2.1 兼容,文件在过渡期内被解释为 Latin-1。此过渡期在 Python 2.5 结束,如果遇到非 ASCII 字符且未声明源编码,则会报错。
基本原理
使用 PEP 263,可以在 Python 文件中使用任意非 ASCII 字符,但比较繁琐。必须显式添加编码声明。即使某些编辑器(如 IDLE 和 Emacs)支持 PEP 263 的声明,许多编辑器仍然不支持(并且永远不会支持);用户必须在逐个文件的基础上显式调整编辑器假设的编码。
当默认编码更改为 UTF-8 时,向 Python 文件添加非 ASCII 文本变得更容易且更具可移植性:在某些系统上,编辑器在保存文本时会自动选择 UTF-8(例如在使用 UTF-8 的区域设置的 Unix 系统上)。在其他系统上,编辑器在读取文件时会猜测编码,而 UTF-8 很容易猜测。还有其他编辑器支持将默认编码与文件扩展名关联,允许用户将 .py 与 UTF-8 关联。
对于 Python 2,使用非 UTF-8 编码的一个重要原因是,字节字符串字面量在运行时将采用源编码,从而允许将其输出到文件或按原样呈现给用户。在 Python 3 中,所有字符串都将是 Unicode 字符串,因此源代码的原始编码在运行时不会产生任何影响。
实现
如果未指定源编码,则需要更改解析器以接受字节 > 127;它不需要报错,而是需要检查字节是否为有效的 UTF-8(无需解码,因为解析器无论如何都会将所有源代码转换为 UTF-8)。
需要更改 IDLE 以使用 UTF-8 作为默认编码。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-3120.rst
上次修改时间:2023年9月9日 17:39:29 GMT