Python 2.7からPython 3.6。
英語以外のコンテンツを扱うスクリプトがあります。
私は通常、cronを介して、またターミナルでスクリプトを実行します。
Python 2.7スクリプトにUnicodeDecodeErrorがあり、これで解決しました。
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Python 3.6では動作しません。print("Here %s" % (myvar))
のような印刷ステートメントがあり、エラーがスローされます。この問題をmyvar.encode("utf-8")
に置き換えることで解決できますが、印刷ステートメントごとに書きたくありません。
ターミナルでPYTHONIOENCODING=utf-8
を実行しましたが、まだその問題があります。
Python 3.6でUnicodeDecodeError
の問題を解決するためのより明確な方法はありますか?
python3にutf-8ですべてを印刷するように指示する方法はありますか?私がPython2でやったように?
ロケールが壊れているようですそして別のバイト-> Unicodeの問題があります。 Python 2.7に対して行ったのは、実際の問題を隠すだけのハックです(あなたがreload sys
で機能させます)。
ロケールを修正するには、コマンドラインからlocale
と入力してみてください。次のようになります。
LANG=en_GB.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_ALL=
locale
は、LANG
が正しく設定されているかどうかに依存します。 Pythonは、locale
を効果的に使用して、stdoutに書き込むときに使用するエンコーディングを計算します。それがうまくいかない場合は、デフォルトでASCIIになります。
最初にロケールを修正する必要があります。locale
エラーの場合は、地域に適した言語パックがインストールされていることを確認してください。
他のすべてが失敗した場合は、常にPythonを設定してPYTHONIOENCODING=UTF-8
。もう一度問題を隠蔽するため、これは最後の手段として使用する必要があります。
PythonがPYTHONIOENCODING
を設定した後もエラーをスローしている場合は、スタックトレースを使用して質問を更新してください。暗黙の変換が行われている可能性があります。
Pythonのみのソリューションの場合、_sys.stdout
_オブジェクトを再作成する必要があります。
_import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach())
_
この後、通常のprint("hello world")
は自動的にUTF-8にエンコードされます。
しかし、なぜあなたの端末がこのような奇妙なエンコーディングに設定されているのかを理解する必要があります(Pythonに採用しようとしているだけです)。
編集:私のテストでは、環境変数LANG
の設定を解除すると、stdoutエンコーディングにこの奇妙な設定が生成されました:
_LANG= python3
import sys
sys.stdout.encoding
_
印刷された_'ANSI_X3.4-1968'
_。
ですから、LANG
を_en_US.UTF-8
_のように設定したいと思うかもしれません。端末プログラムがこれを実行していないようです。
Ubuntu 18.04に基づくDockerコンテナ内でPythonを使用しているときにこの問題が発生しました。これはロケールの問題であるように見えました。Dockerfileに以下を追加することで解決しました:
ENV LANG C.UTF-8