我从网站上了解到,当我不想输入友好的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
哎呀,这是什么?我不认为它可以被计算机识别。代码在世界上应该声明什么?我感到越来越困惑。
感谢您的帮助。
答案 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)这是一个需要操作的消息。你可以真正使用你想要的任何东西,包括@MarkZar
或WTF!
......只是惯例!
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
。