3

我有一个 python 脚本,它使用他们的调度程序插件在 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

那么,为什么要尝试以 ASCII 格式输出其他文本却失败了呢?

更新: FWIW,这是我正在使用的实际脚本。调试输出在第 38-39 行。

4

1 回答 1

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

于 2013-02-15T16:51:20.097 回答