Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

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 中,源编码因引入 Unicode 而意外地更改为 Latin-1。对于 Unicode 字符串字面量,字符仍按原样从源文件复制,但逐个字符地加宽。由于 Unicode 对代码点有固定的解释,此算法有效地固定了源编码,至少对于包含 Unicode 字面量中的非 ASCII 字符的文件而言。

PEP 263 指出了一个问题,即在 Unicode 字面量中只能使用那些也存在于 Latin-1 中的 Unicode 字符,并引入了一种声明源编码的语法。如果未给出源编码,则默认应为 ASCII。为了与 Python 2.0 和 2.1 兼容,文件在过渡期内被解释为 Latin-1。此过渡期在 Python 2.5 结束,如果遇到非 ASCII 字符且未声明源编码,Python 2.5 将报错。

基本原理

有了 PEP 263,在 Python 文件中使用任意非 ASCII 字符成为可能,但很麻烦。必须明确添加编码声明。尽管有些编辑器(如 IDLE 和 Emacs)支持 PEP 263 的声明,但许多编辑器仍然不支持(并且永远不会支持);用户必须逐个文件地明确调整编辑器假定的编码。

当默认编码更改为 UTF-8 时,将非 ASCII 文本添加到 Python 文件变得更容易且更具可移植性:在某些系统上,编辑器在保存文本时会自动选择 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

最后修改:2025-02-01 08:59:27 GMT