Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python打印到Heroku日志时出现Unicode错误_Python_Heroku_Utf 8 - Fatal编程技术网

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

从Python打印到Heroku日志时出现Unicode错误,python,heroku,utf-8,Python,Heroku,Utf 8,我有一个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 这时我在脚本中有这样一行: p

我有一个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]
我不知道该怎么办。如果我在脚本中有以下内容:

print u"Unicode test: £ ’ …"
import locale
print u"Encoding: %s" % locale.getdefaultlocale()[1]
然后在日志中输出:

Encoding: UTF-8
那么,为什么它试图以ASCII格式输出其他文本,但失败了呢

更新:FWIW,我正在使用。调试输出在第38-39行。

如错误所示:

no encoding declared
i、 e 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字符的内容。

如果您按照此处所述定义源代码编码,会发生什么情况?正如Chris Harris所说,在文件顶部使用
#coding=utf8
(或者可能是
utf-8
?)怎么样?另外,您也看到了这个答案吗?Phil,请用实际写入日志的代码修改您的示例。当您已经声明了编码时,上面的
print
语句肯定不会产生错误,而是一些其他语句。在下面的回答中,我提到在将Unicode字符写入字节大小的流时必须使用
.encode('utf-8')
。我不确定您所说的
print
语句“不会产生错误”是什么意思。当打印到Heroku的日志时,它肯定会给我带来错误。但是使用
.encode('utf-8')
让它工作起来了,谢谢。谢谢你这么做,还有上面的评论。我现在已经试过了,但我仍然得到了同样的错误…一个Mac。我刚刚用一个链接更新了这个问题,链接到我正在使用的实际脚本,以防有所帮助。Sublime有“使用编码保存”->“UTF-8”选项。你这么做了吗?我刚刚在我的Mac电脑上测试了你的线路,并声明了一个编码,用Sublime保存为UTF-8。我没有错误,所以线路本身是好的。是的,我可以在我的Mac上运行它,但是当输出到Heroku日志时,我得到了错误。