177

POST メソッドを使用して Web ページにデータを送信する Python (Python 3.3) プログラムを作成しています。主にデバッグプロセスのために、ページの結果を取得し、関数を使用して画面に表示していprint()ます。

コードは次のようになります。

conn.request("POST", resource, params, headers)
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode('utf-8'));

このHTTPResponse .read()メソッドはbytes、ページをエンコードする要素を返します (これは適切にフォーマットされた UTF-8 ドキュメントです) Windows 用の IDLE GUI の使用をやめ、代わりに Windows コンソールを使用するまでは問題ないように思えました。返されたページには U+2014 文字 (em-dash) が含まれており、印刷機能は Windows GUI (コード ページ 1252 と推測します) では適切に変換されますが、Windows コンソール (コード ページ 850) では変換されません。デフォルトの動作を考えるとstrict、次のエラーが発生します。

UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 10248: character maps to <undefined>

この非常に醜いコードを使用して修正できます。

print(data.decode('utf-8').encode('cp850','replace').decode('cp850'))

問題のある文字「—」を?. 理想的なケースではありませんが (ハイフンを使用する方が適切です)、目的には十分です。

私のソリューションには、気に入らないことがいくつかあります。

  1. コードは、デコード、エンコード、およびデコードのすべてが醜いです。
  2. この場合だけの問題を解決します。他のエンコーディング (latin-1、cp437、cp1252 など) を使用するシステムにプログラムを移植すると、ターゲットのエンコーディングが認識されるはずです。そうではありません。(たとえば、IDLE GUI を再度使用すると、以前は発生しなかった emdash も失われます)
  3. emdash が尋問の感嘆符ではなくハイフンに変換された方がよいでしょう。

問題は emdash ではありません (特に問題を解決する方法はいくつか考えられます) が、堅牢なコードを作成する必要があります。データベースからのデータをページにフィードしていますが、そのデータが戻ってくる可能性があります。他にも多くの競合するケースが予想されます。'Á' U+00c1 (私のデータベースでは可能) は CP-850 (西ヨーロッパ言語の DOS/Windows コンソール エンコーディング) に変換できますが、CP-437 (米国のエンコーディング) には変換できません。多くの Windows インストールでは英語がデフォルトです)。

だから、質問:

私のコードを出力インターフェイスのエンコーディングにとらわれないようにする、より良い解決策はありますか?

4

6 に答える 6

23

これをさらに深く掘り下げたところ、最善の解決策がここにあることがわかりました。

http://blog.notdot.net/2010/07/Getting-unicode-right-in-Python

私の場合、「UnicodeEncodeError:「charmap」コーデックは文字をエンコードできません」を解決しました

元のコード:

print("Process lines, file_name command_line %s\n"% command_line))

新しいコード:

print("Process lines, file_name command_line %s\n"% command_line.encode('utf-8'))  
于 2017-05-09T08:03:28.590 に答える