Python解释器假定的代码的默认编码方法是什么?

时间:2014-08-08 14:05:38

标签: python encoding

有些人使用以下方法声明Python源代码文本的编码方法:

# -*- coding: utf-8 -*-

早在2001年,据说Python解释器假设的默认编码方法是ASCII。我在我的Python代码中使用非ASCII字符处理字符串,而没有声明我的代码的编码方法,我不记得我之前遇到过编码错误。现在Python解释器假定的代码的默认编码是什么?

我不确定这是否相关。 我的操作系统是Ubuntu,我使用默认的Python解释器,gedit或emacs进行编辑。 如果上面的更改,Python解释器的默认编码方法会改变吗?

感谢。

2 个答案:

答案 0 :(得分:1)

如果没有任何明确的编码声明,源代码的假定编码将为

  • ascii for Python 2.x
  • utf-8 for Python 3.x

对于Python 2.x,请参阅PEP 0263Using source code encoding,对于Python 3.x,请参阅PEP 3120的新默认值utf-8

因此,源代码假设的默认编码将直接取决于Python解释器的版本,并且不可配置


请注意,源代码编码与在字符串中处理数据的非ASCII字符完全不同。

有两种不同的情况,您可能会遇到非ASCII字符:

  • 作为程序数据的一部分,在运行时
  • 作为源代码的一部分(并且由于标识符中不能包含非ASCII字符,因此通常表示源代码或注释中的硬编码字符串数据)。

源代码编码声明会影响您的源代码的编码方式 - 因此只有在您决定将非ASCII字符直接放入源代码

因此,以下代码最终必须处理data.txt中可能存在非ASCII字符的事实:

with open('data.txt') as f:
    for line in f:
        # do something with `line`

源代码中包含任何非ASCII字符,因此它不需要在文件顶部进行编码声明。但是,如果要将line转换为unicode,则需要正确解码unicode(line)。简单地执行ascii将使用系统默认编码,即ascii(与默认源编码不同,但恰好也是utf-8)。因此,要使用line.decode('utf-8')明确解码字符串,您需要执行TEST_DATA = 'Bär' # <--- non-ASCII character on this line print TEST_DATA


此代码确实直接在其源代码中包含非ASCII字符:

SyntaxError

除非你声明一个明确的源代码编码,否则它将失败,并且SyntaxError: Non-ASCII character '\xc3' in file foo.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 与此类似,但

utf-8

假设你的文本编辑器配置为保存# -*- coding: utf-8 -*- 中的文件,你需要放行

TEST_DATA = 'B\xc3\xa4r'

位于文件顶部,供Python正确解释源代码

我的建议是一般避免在源代码中放入非ASCII字符,这完全是因为如果它取决于您和您的同事编辑器和终端设置,那么它将被正确地写入和读取。

相反,您可以使用转义字符串在代码中安全地输入非ASCII字符:

{{1}}

答案 1 :(得分:0)

默认情况下,Python源文件被视为以UTF-8编码。在该编码中, - 尽管标准库仅将ASCII字符用于标识符,但任何可移植代码都应遵循该约定。要正确显示所有这些字符,编辑器必须识别该文件是UTF-8,并且必须使用支持文件中所有字符的字体。

也可以为源文件指定不同的编码。为此,我们将以下代码放在代码之上!

# -*- coding: encoding -*-

https://docs.python.org/dev/tutorial/interpreter.html