有些人使用以下方法声明Python源代码文本的编码方法:
# -*- coding: utf-8 -*-
早在2001年,据说Python解释器假设的默认编码方法是ASCII。我在我的Python代码中使用非ASCII字符处理字符串,而没有声明我的代码的编码方法,我不记得我之前遇到过编码错误。现在Python解释器假定的代码的默认编码是什么?
我不确定这是否相关。 我的操作系统是Ubuntu,我使用默认的Python解释器,gedit或emacs进行编辑。 如果上面的更改,Python解释器的默认编码方法会改变吗?
感谢。
答案 0 :(得分:1)
如果没有任何明确的编码声明,源代码的假定编码将为
ascii
for Python 2.x utf-8
for Python 3.x 对于Python 2.x,请参阅PEP 0263和Using source code encoding,对于Python 3.x,请参阅PEP 3120的新默认值utf-8
。
因此,源代码假设的默认编码将直接取决于Python解释器的版本,并且不可配置。
请注意,源代码编码与在字符串中处理数据的非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 -*-