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

7
我是一名有用的助手,可以为您翻译文本。

我从网站上学到,当我想要输入友好的Unicode字符时,我应该在Python中添加代码声明: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个回答

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),这是需要采取行动的消息。你可以使用任何你想要的东西,包括@MarkZarWTF!... 只是个约定!

希望对你有所帮助!


哦,非常感谢您的详细解答。但我还有一些不太清楚的问题。代码声明的格式是否因系统和编辑器而异?如果sys.setdefaultencoding在这里无用,它的真实功能是什么?非常感谢。 - Searene
@MarkZar - 有些人可能会说这是Python的设计缺陷,因为它带来的困惑比帮助更多。 :) 这里 解释了为什么一直不鼓励使用它,并提供了许多博客文章链接,说明使用sys.setdefaultencoding存在问题的情况。 - mac

0

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


0

编码设置使用正则表达式coding[:=]\s*([-\w.]+)在行中的任何位置进行搜索。这意味着:

  • 查找确切的字符串coding=coding:后跟零个或多个空格字符,后跟至少一个由字母数字、_-组成的字符序列。

  • 捕获至少一个字符序列...

  • 捕获的部分用作编码。

也就是说,使用类似于任何内容都是完全合法的。

# This program was written for Python 3. Encoding that should be used for decoding: UTF-8!

因为所需格式的字符串仍然可以在那里找到


Python 3源文件默认使用UTF-8编码,因此在Python 3代码中只要使用UTF-8,就不需要添加# coding: utf-8

看起来UTF-8在3.4中被明确规定,并且早期版本的Python 3也默认使用ASCII。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接