我有一个python脚本,它使用他们的Scheduler附加组件定期在Heroku上运行。它打印一些调试信息,但是当文本中有非ASCII字符时,我在日志中收到错误,如:
SyntaxError: Non-ASCII character '\xc2' in file send-tweet.py on line 40, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
那是我在剧本中有这样的一行:
print u"Unicode test: £ ’ …"
我不知道该怎么做。如果我在脚本中有这个:
import locale
print u"Encoding: %s" % locale.getdefaultlocale()[1]
然后在日志中输出:
Encoding: UTF-8
那么,为什么要尝试输出其他文本并以失败告终?
更新: FWIW,here's the actual script我正在使用。调试输出在第38-39行。
答案 0 :(得分:3)
正如错误所说:
no encoding declared
即你的Python源文件中没有声明编码。
链接的PEP告诉您如何在Python源中声明编码:编码应设置为编辑器/ IDE在您输入示例中的unicode字符时使用的表。假设最有可能是UTF-8,所以在send-tweet.py
的第一行放置了这个:
# coding=utf-8
如果第一行已包含路径指令,如:
#!/usr/local/bin/python
然后将编码指令放在第二行,例如
#!/usr/local/bin/python
# coding=utf-8
此外,在Python源代码中编写Unicode字符并声明UTF-8编码时,必须使用具有UTF-8文件保存支持的编辑器,即可以将Unicode代码点序列化的编辑器UTF-8。
在这方面,请注意Unicode和UTF-8不一样。 Unicode是指标准,而UTF-8是一种特定的编码,用于确定如何将Unicode代码点序列化为与ASCII兼容的字符串,并使用1到4个字节来表示原始的Unicode字符串。
因此在Python解释器中,字符串可能存储为Unicode,但如果要将Unicode字符串写为UTF-8,则需要首先将字符串显式序列化为UTF-8,例如
s.encode("utf-8")
这在将Unicode字符串输出到字节大小的流时非常重要,例如写入日志文件句柄时,通常采用字节大小的字符,即UTF-8表示包含非ASCII字符的内容。