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'))
問題のある文字「—」を?
. 理想的なケースではありませんが (ハイフンを使用する方が適切です)、目的には十分です。
私のソリューションには、気に入らないことがいくつかあります。
- コードは、デコード、エンコード、およびデコードのすべてが醜いです。
- この場合だけの問題を解決します。他のエンコーディング (latin-1、cp437、cp1252 など) を使用するシステムにプログラムを移植すると、ターゲットのエンコーディングが認識されるはずです。そうではありません。(たとえば、IDLE GUI を再度使用すると、以前は発生しなかった emdash も失われます)
- emdash が尋問の感嘆符ではなくハイフンに変換された方がよいでしょう。
問題は emdash ではありません (特に問題を解決する方法はいくつか考えられます) が、堅牢なコードを作成する必要があります。データベースからのデータをページにフィードしていますが、そのデータが戻ってくる可能性があります。他にも多くの競合するケースが予想されます。'Á' U+00c1 (私のデータベースでは可能) は CP-850 (西ヨーロッパ言語の DOS/Windows コンソール エンコーディング) に変換できますが、CP-437 (米国のエンコーディング) には変換できません。多くの Windows インストールでは英語がデフォルトです)。
だから、質問:
私のコードを出力インターフェイスのエンコーディングにとらわれないようにする、より良い解決策はありますか?