从Python打印到Heroku日志时出现Unicode错误

时间:2013-02-15 16:16:05

标签: python heroku utf-8

我有一个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行。

1 个答案:

答案 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字符的内容。