我应该在python中输入什么样的编码声明

时间:2011-11-26 12:00:57

标签: python unicode encode

我从网站上了解到,当我不想输入友好的unicode字符时,我应该在python中添加代码声明:http://www.python.org/dev/peps/pep-0263/,但我仍然感到困惑。

假设我使用vim在linux上工作,并创建一个新的py文件和输入代码,如下所示:

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

1 即可。我试图用以下代码替换第2行:

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

但它不起作用,不一样吗?

2 即可。我对linux不太熟悉,我真的不知道为什么我应该在代码迁移的开始和结束时添加_*_,当我试图用# -*- coding: utf8 -*-或{{替换# code=utf8时1}},我收到了一个错误:

# code: utf8

但是网站http://www.python.org/dev/peps/pep-0263/中提到了这些代码声明!

根据文档,允许使用以下代码声明:

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
哎呀,这是什么?我不认为它可以被计算机识别。代码在世界上应该声明什么?我感到越来越困惑。

感谢您的帮助。

4 个答案:

答案 0 :(得分: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! ......只是惯例!

HTH!

答案 1 :(得分:3)

python编码声明的重要部分是coding: utf-8,它应该在第一行python代码之前的注释中,你可以用注释的其他部分做任何你想做的事。

以下是PEP中的行描述了这种行为:

  

更确切地说,第一行或第二行必须与常规行匹配       表达“编码[:=] \ s *([ - \ w。] +)”。第一组       然后将表达式解释为编码名称。如果是编码       Python不知道,在编译期间会引发错误。那里       不能是包含该行的任何Python语句       编码声明。

答案 2 :(得分:0)

您需要该行,因为您需要告诉编译器源代码使用哪种编码。

答案 3 :(得分:0)

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

  • 找到确切的字符串coding=coding:,后跟零个或多个空格字符,然后运行至少一个字母数字字符_-

  • 捕获至少一个......>

  • 捕获的部分用作编码。

也就是说,使用像

这样的东西是完全合法的
# This program was written for Python 3. Encoding that should be used for decoding: UTF-8!

因为所需格式的字符串仍然可以是found there

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