2013-02-15 76 views
3

我目前正使用他們的計劃附加在Heroku上定期運行python腳本。它打印一些調試信息,但是當有一個在文本中的非ASCII字符,我得到像日誌的錯誤:Unicode的錯誤日誌

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,here's the actual script我正在使用。調試輸出在38-39行。

+1

如果您按照此處所述定義源代碼編碼,會發生什麼情況? HTTP://www.python。org/dev/peps/pep-0263/ – Ci3 2013-02-15 16:21:05

+0

就像Chris Harris說的那樣,在文件頂部使用'#coding = utf8'(或者'utf-8'?)怎麼樣? – alxbl 2013-02-15 16:22:23

+0

另外,你看看這個答案嗎? http://stackoverflow.com/a/6289494/1343005 – Ci3 2013-02-15 16:23:09

回答

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字符串輸出到字節大小的流時尤爲重要,例如,當寫入通常採用字節大小的字符的日誌文件句柄時,即用於包含非ASCII字符的內容的UTF-8。

+0

感謝您的評論以及上述評論。我現在試過了,我仍然得到相同的錯誤... – 2013-02-15 17:09:03

+0

你使用的是什麼編輯器? – nikola 2013-02-15 17:10:59

+0

我使用Sublime Text 2. – 2013-02-15 17:16:06