我应该在Python 3中使用编码声明吗?

142

Python 3默认使用UTF-8编码源代码文件。我是否仍应在每个源文件开头使用编码声明,例如# -*- coding: utf-8 -*-

2个回答

147

因为默认情况下使用的是UTF-8,所以只有在你偏离默认设置或者依赖其他工具(比如你的IDE或文本编辑器)来使用该信息时,你才需要使用声明。

换句话说,就Python而言,只有当你想要使用不同的编码时,你才需要使用该声明。

其他工具,如你的编辑器,可以支持类似的语法,这就是为什么PEP 263规范允许语法具有相当的灵活性(它必须是一条注释,其中包含文本coding,后面跟着一个:=字符和可选的空格,然后是一个被识别的编解码器)。

请注意,这仅适用于Python读取源代码的方式。它不适用于执行该代码,因此不适用于打印、打开文件或任何其他I/O操作在字节和Unicode之间的转换。有关Python、Unicode和编码的更多详细信息,请务必阅读Python Unicode HOWTO,或者由Ned Batchelder非常详尽地介绍的Pragmatic Unicode talk

35
当编辑源文件时,# -*- coding: utf-8 -*- 对于一些编辑器仍然有用,可以帮助切换到预期的编码格式。 - pepr
1
@pepr 一个字节顺序标记也可以做到同样的事情,对吧? - endolith
21
UTF-8 BOM是由微软引入的地球上的一种可憎物。参见https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8。 - Martijn Pieters
2
@MartijnPieters,您的链接似乎与您不符。 - endolith
3
@endolith:不,维基百科文章只是概括了背景,我的观点是这是一个可恶的行为。BOM 的目的是记录字节顺序(因此名称为“字节顺序标记”)。在 UTF-8 中不存在字节顺序混淆,它只在 UTF-16 和 UTF-32 中具有该功能。该值已经是一个重新指定的零宽度不换行空格字符(方便之处在于意外打印后会得到完全看不见的输出),将其重新用作魔术常量是错误的,我认为。 - Martijn Pieters
显示剩余4条评论

16

不需要声明编码方式的情况:

  • 整个项目只使用默认的UTF-8编码方式。
  • 你确定你的IDE工具不需要每个文件中都声明编码方式。

需要声明编码方式的情况:

  • 你的项目依赖于不同的编码方式。
  • 或者依赖于多种编码方式。

对于多编码方式的项目:

如果一些文件采用了非UTF-8编码方式,即使是采用了UTF-8编码方式的文件,也应该添加编码声明,因为黄金法则是“显式比隐式更好”。

参考文献:

  • PyCharm不需要这种声明:

在PyCharm中为特定文件配置编码

  • vim不需要这种声明,但是:
# vim: set fileencoding=<encoding name> :

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接