PEP 686 – 使 UTF-8 模式为默认值 | peps.python.org

这是一个关于 Python 的 PEP(Python 增强提案)的详细信息总结:

  • 作者及相关信息:作者为 Inada Naoki,邮箱为 songofacandy at gmail.com,讨论线程为Discourse thread,状态为 Accepted,类型为 Standards Track,创建时间为 18-Mar-2022,Python 版本为 3.15,帖子历史包括18-Mar-202231-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添加了TextIOWrapperencoding="locale"选项,但当前在 UTF-8 模式下即使指定了该选项仍使用"UTF-8",此不一致性在 Python 3.11 中已修复。
  • 向后兼容性:主要影响 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作为管道的默认编码以缓解向后兼容性问题,但会使“默认编码”变得复杂且向后不兼容,此方案被拒绝。
  • 如何教授此内容:对新用户减少了需要教授的关于文本编码的内容,现有用户参考[向后兼容性]部分。
  • 版权:此文档置于公共领域或 CC0-1.0-Universal 许可之下, whichever is more permissive。
阅读 44
0 条评论