我在Python中应该输入什么类型的编码声明?

7 投票
4 回答
4391 浏览
提问于 2025-04-17 07:06

我在网上了解到,当我想在Python中输入友好的Unicode字符时,应该添加代码声明:http://www.python.org/dev/peps/pep-0263/,但我对此还是感到困惑。

假设我在Linux系统上使用vim编辑器,我创建了一个新的py文件,并输入了如下代码:

#!/usr/bin/python2.7
# -*- coding: utf8 -*-
s = u'ޔ'
print s

1. 我尝试用以下代码替换第2行:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

但它不起作用,这不是一样的吗?

2. 我对Linux不太熟悉,真的不知道为什么我需要在代码声明的开头和结尾加上_*_,而且当我尝试用# code=utf8# code: utf8替换# -*- coding: utf8 -*-时,出现了错误:

File "pythontest.py", line 3
SyntaxError: Non-ASCII character '\xde' in file pythontest.py on line 3, but no encoding declared; see     http://www.python.org/peps/pep-0263.html for details

但这些代码声明在网站上有提到啊http://www.python.org/dev/peps/pep-0263/

根据文档,以下的代码声明是被允许的:

# This Python file uses the following encoding: utf-8

哎,这是什么?我觉得计算机应该无法识别这个。到底应该怎么声明代码呢?我越来越困惑了。

谢谢大家的帮助。

4 个回答

0

你需要这一行,因为你要告诉编译器你的源代码使用了什么编码方式。

3

在Python中,编码声明最重要的部分是 coding: utf-8,这个声明应该放在你写的第一行Python代码之前,并且你可以在这个注释的其他部分随意写一些内容。

下面是PEP中描述这个行为的内容:

更具体地说,第一行或第二行必须符合这个规则:"coding[:=]\s*([-\w.]+)"。这个规则中的第一个部分会被解释为编码名称。如果Python不知道这个编码,就会在编译时出现错误。而且,包含编码声明的那一行不能有任何Python代码。

3

你链接的PEP的摘要其实说得很清楚:

这个PEP提议引入一种语法,用来声明一个Python源文件的编码方式。然后,这些编码信息会被Python解析器使用,以便用指定的编码来解释这个文件。最重要的是,这样可以更好地处理源代码中的Unicode字面量,并且可以直接在支持Unicode的编辑器中使用例如UTF-8来编写Unicode字面量。

(强调部分是我加的)。

即使你想做的事情能够实现(通过程序方式替换源文件的编码),但这样做其实没有意义。想想看:代码是静态的(不会改变)。用不同的编码去读取它是没有意义的:只有一个正确的编码(就是源文件作者编辑时使用的编码)。

至于语法:

# This Python file uses the following encoding: utf-8

PEP本身说这个语法是“没有解释器行,使用纯文本”。这个语法是为了人类使用的。所以如果你在文本编辑器中打开一个文件,发现里面全是乱码,你可以手动在菜单中设置源文件的编码。

编辑:关于为什么要把编码放在# -*--*-之间……这纯粹是个约定。第一个符号,井号,表示这是一个注释(所以不会被编译成字节码),然后_*_只是告诉解析器,这个特定的注释是给它的。

这和在你的源代码中放入:

# TODO: fix this nasty bug

是一样的,其中TODO:部分告诉开发者(和一些IDE),这是一个需要处理的消息。你其实可以用任何你想要的内容,包括@MarkZar或者WTF!……这只是个约定而已!

希望这对你有帮助!

撰写回答