web-dev-qa-db-ja.com

Linux / Python:印刷用のUnicode文字列のエンコード

かなり大きなpython 2.6アプリケーションがあり、多くのprintステートメントが散らばっています。全体でUnicode文字列を使用しており、通常はうまく機能します。ただし、アプリケーションの出力をリダイレクトすると( "myapp.py> output.txt")のように、次のようなエラーが発生することがあります。

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)

誰かがLOCALEをASCIIに設定した場合にも、同じ問題が発生すると思います。今、私はこのエラーの理由を完全によく理解しています。 Unicode文字列にASCIIでエンコードできない文字があります。けっこうだ。しかし、私のpythonプログラムは、疑わしい文字をスキップするか、Unicode IDに置き換えるなど、理解しやすいものを印刷するために最善を尽くしてほしいと思います。

この問題は一般的である必要があります...この問題を処理するためのベストプラクティスは何ですか?昔ながらの「印刷」を使い続けることができるソリューションが欲しいのですが、必要に応じてすべてのオカレンスを変更できます。

PS:私は今この問題を解決しました。解決策は与えられた答えのどちらでもありませんでした。コメントの1つでChrisJによって与えられたように、 http://wiki.python.org/moin/PrintFails で与えられた方法を使用しました。つまり、sys.stdoutを、正しい引数を使用してUnicodeエンコードを呼び出すラッパーに置き換えます。非常にうまく機能します。

19
Mats Ekberg

私は今この問題を解決しました。解決策は、与えられた答えのどちらでもありませんでした。コメントの1つでChrisJによって与えられたように、 http://wiki.python.org/moin/PrintFails で与えられた方法を使用しました。つまり、sys.stdoutを、正しい引数を使用してUnicodeエンコードを呼び出すラッパーに置き換えます。非常にうまく機能します。

5
Mats Ekberg

ASCIIターミナルにダンプする場合は、unicode.encodeを使用して手動でエンコードし、エラーを無視するように指定します。

u = u'\xa0'
u.encode('ascii') # This fails
u.encode('ascii', 'ignore') # This replaces failed encoding attempts with empty string

Unicodeファイルを保存する場合は、次のことを試してください。

u = u'\xa0'
print >>open('out', 'w'), u # This fails
print >>open('out', 'w'), u.encode('utf-8') # This is ok
18
Triptych

すべてのprintステートメントをメソッドでラップして任意のUnicode-> utf8変換を実行するか、最後の手段として、site.py内でPythonデフォルトのエンコーディングをasciiからutf-8に変更します。一般的にはPythonは、Unicode文字列を構成済みのデフォルトエンコーディングであるASCIIに暗黙的に変換するため、フィルタリングされていないUnicode文字列をsys.stdoutに出力することはお勧めできません。

2
Andreas Jung