这是一个关于 Python 的 PEP(Python 增强提案)的详细信息总结:
- 作者及相关信息:作者为 Inada Naoki,邮箱为 songofacandy at gmail.com,讨论线程为Discourse thread,状态为 Accepted,类型为 Standards Track,创建时间为 18-Mar-2022,Python 版本为 3.15,帖子历史包括18-Mar-2022和31-Mar-2022,决议为Discourse message。
- 摘要:提议默认启用UTF-8 模式,使 Python 对文件、标准输入输出和管道的默认编码一致为 UTF-8。
- 动机:UTF-8 是事实上的标准文本编码,Python 源文件默认编码为 UTF-8,许多其他语言和工具也使用 UTF-8,改变默认编码便于 Python 与其他语言互操作,且很多 Python 开发者在处理 UTF-8 编码文件时会忽略指定编码导致错误。
规范:
- 默认启用 UTF-8 模式:从 Python 3.15 起默认启用 UTF-8 模式,用户可通过设置
PYTHONUTF8=0
或-X utf8=0
禁用。 locale.getencoding()
:添加locale.getencoding()
API 以获取区域设置编码,忽略 UTF-8 模式,当指定warn_default_encoding
选项时,locale.getpreferredencoding()
会发出EncodingWarning
,此 API 于 Python 3.11 添加。- 修复
encoding="locale"
选项:PEP 597添加了TextIOWrapper
的encoding="locale"
选项,但当前在 UTF-8 模式下即使指定了该选项仍使用"UTF-8",此不一致性在 Python 3.11 中已修复。
- 默认启用 UTF-8 模式:从 Python 3.15 起默认启用 UTF-8 模式,用户可通过设置
- 向后兼容性:主要影响 Windows 用户,可能导致
UnicodeError
、乱码或数据损坏,解决向后兼容性问题的指南为:禁用 UTF-8 模式,使用EncodingWarning
查找受影响的地方,测试应用程序。 - 先前的例子:Ruby 在 Ruby 3.0(2020 年)将默认
external_encoding
改为 UTF-8,Java 在 JDK 18(2022 年)将默认文本编码改为 UTF-8,两者都有向后兼容性选项,但没有像 Python 的PEP 597那样的EncodingWarning
。 被拒绝的替代方案:
- 弃用隐式编码:考虑弃用默认编码的使用,但在很多只处理 ASCII 文本的情况下不适用,强制用户指定
encoding
会很痛苦,Java 也拒绝了此想法。 - 使用
PYTHONIOENCODING
用于管道:考虑在subprocess
模块中使用PYTHONIOENCODING
作为管道的默认编码以缓解向后兼容性问题,但会使“默认编码”变得复杂且向后不兼容,此方案被拒绝。
- 弃用隐式编码:考虑弃用默认编码的使用,但在很多只处理 ASCII 文本的情况下不适用,强制用户指定
- 如何教授此内容:对新用户减少了需要教授的关于文本编码的内容,现有用户参考[向后兼容性]部分。
- 版权:此文档置于公共领域或 CC0-1.0-Universal 许可之下, whichever is more permissive。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。