3

スケジューラアドオンを使用してHerokuで定期的に実行されているPythonスクリプトがあります。デバッグ情報が出力されますが、テキストに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が使用するテーブルに設定する必要があります。ほとんどの場合、UTF-8が想定されているため、最初の行に次のように記述しますsend-tweet.py

# coding=utf-8

最初の行に次のようなパスディレクティブがすでに含まれている場合:

#!/usr/local/bin/python

次に、エンコーディングディレクティブを2行目に配置します。

#!/usr/local/bin/python
# coding=utf-8

また、PythonソースでUnicode文字を記述し、UTF-8エンコーディングを宣言する場合は、UTF-8ファイル保存をサポートするエディター、つまりUnicodeコードポイントをUTF-8にシリアル化できるエディターを使用する必要があります。

この点で、UnicodeとUTF-8は同じではないことに注意してください。Unicodeは標準を指しますが、UTF-8は、UnicodeコードポイントをASCIIと互換性があり、元のUnicode文字列を表すために1〜4バイトを使用する文字列にシリアル化する方法を決定する特定のエンコーディングです。

したがって、Pythonインタープリターでは、文字列はUnicodeとして格納される場合がありますが、Unicode文字列をUTF-8として記述したい場合は、最初に文字列をUTF-8に明示的にシリアル化する必要があります。

s.encode("utf-8")

これは、Unicode文字列をバイトサイズのストリームに出力する場合、たとえば、通常はバイトサイズの文字を想定するログファイルハンドル、つまり非ASCII文字を含むコンテンツのUTF-8に書き込む場合に特に重要です。

于 2013-02-15T16:51:20.097 に答える