如果没有任何显式的编码声明,源代码的假定编码将是ascii用于python2.x
utf-8用于python3.x
对于python2.x,请参见PEP 0263和Using source code encoding,对于python3.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,则需要正确解码line。简单地执行unicode(line)将使用系统默认编码,即ascii(与默认源代码编码不同,但碰巧也是ascii)。所以要使用utf-8显式地解码字符串,您需要执行line.decode('utf-8')。在
但是,此代码的源代码中不直接包含非ASCII字符:
^{pr2}$
它将以类似于此的SyntaxError失败,除非您声明一个显式的源代码编码:
^{3}$
因此,假设您的文本编辑器配置为将文件保存在utf-8中,则需要将以下行# -*- coding: utf-8 -*-
在文件的顶部,以便Python正确解释源代码。在
不过,我的建议是,一般不要在源代码中使用非ASCII字符,因为如果它取决于您和您的同事的编辑器和终端设置,那么它的写入和读取是否正确。在
相反,您可以使用转义字符串在代码中安全地输入非ASCII字符:TEST_DATA = 'B\xc3\xa4r'