Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解释器假定的代码默认编码方法是什么?_Python_Encoding - Fatal编程技术网

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

Python解释器假定的代码默认编码方法是什么?,python,encoding,Python,Encoding,有些人使用以下方法声明Python源代码文本的编码方法: # -*- coding: utf-8 -*- TEST_DATA = 'Bär' # <--- non-ASCII character on this line print TEST_DATA 早在2001年,据说Python解释器假定的默认编码方法是ASCII。我在Python代码中使用非ASCII字符处理字符串,但没有声明代码的编码方法,我不记得以前遇到过编码错误。Python解释器现在假定的代码默认编码是什么 我不

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

# -*- coding: utf-8 -*-
TEST_DATA = 'Bär'    # <--- non-ASCII character on this line
print TEST_DATA
早在2001年,据说Python解释器假定的默认编码方法是ASCII。我在Python代码中使用非ASCII字符处理字符串,但没有声明代码的编码方法,我不记得以前遇到过编码错误。Python解释器现在假定的代码默认编码是什么

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


谢谢。

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

也可以为源文件指定不同的编码。为了做到这一点,我们把下面的代码放在我们的代码之上

# -*- coding: encoding -*-

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

  • Python 2.x的ascii
  • utf-8
    用于Python 3.x
对于Python2.x,请参见和,对于Python3.x,请参见新的默认值
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字符,因此不需要在文件顶部声明编码。但是,如果要将其转换为unicode,则需要正确解码
。只需执行
unicode(line)
即可使用系统默认编码,即
ascii
(与默认源代码编码不同,但恰好也是
ascii
)。因此,要使用
utf-8
明确地解码字符串,您需要执行
line.decode('utf-8')


但是,此代码的源代码中不直接包含非ASCII字符:

# -*- coding: utf-8 -*-
TEST_DATA = 'Bär'    # <--- non-ASCII character on this line
print TEST_DATA
因此,假设您的文本编辑器配置为将文件保存在
utf-8
中,则需要将

# -*- coding: utf-8 -*-
位于文件顶部,以便Python正确解释源代码

然而,我的建议是,通常避免在源代码中使用非ASCII字符,因为如果它取决于您和您的同事的编辑器和终端设置,那么它将被正确写入和读取

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

TEST_DATA = 'B\xc3\xa4r'

Python2仍然使用ASCII作为默认编码。它只在Python 3中更改为UTF-8,Arch Linux是唯一一个将Python 3作为默认
Python
的发行版。您所说的“我在Python代码中使用了非ASCII字符处理字符串,但没有声明代码的编码方法,我不记得以前遇到过编码错误”到底是什么意思?除非您使用的是Python 3,否则这是不可能的,假设您的源代码中实际上有非ASCII字符。@lukas:我记得我写了一个脚本,读取了一个带有非ASCII字符的文件,然后将其输出到另一个文件,而不声明任何编码方法。全部的works@Tim:那是完全不同的。这是您的程序处理字符串中的非ASCII字符,作为处理数据的一部分。但是源代码编码声明会影响解释源代码的编码方式-因此,只有当您决定在源代码中直接输入非ASCII字符时,才需要它。@Lukas:当我的脚本读取文件时,文件内容不是变成字符串吗?在将字符串写回另一个文件之前,我还进行了一些正则表达式匹配来修改字符串。Python解释器解释字符串内容的编码方法是什么?谢谢。“默认情况下,Python源文件被视为以UTF-8编码的文件。”这是否由任何/最标准的Python解释器处理?您所说的仅适用于Python 3。对于仍在广泛使用的Python2,默认编码假定为ASCII。@Tim关于解释器,正如Lukas所说的Python3!但是一些编辑器不支持UTF-8!字节文字歧义在Python 3中是固定的:
b'a'
(非ASCII)现在导致
SyntaxError:字节只能包含ASCII文字字符。
Python 2文档:“默认情况下,Python源文件被视为UTF-8编码。”但正如您所说,ASCII是Python 2的默认值,因此这是一个文档错误。