UnicodeEncodeError: 'charmap' Codec kann nicht codieren - Zeichenzuordnungen zu <undefined>, Druckfunktion [duplizieren]

Diese Frage hat hier bereits eine Antwort:

Python, Unicode und die Windows-Konsole 13 answers

Ich schreibe ein Python (Python 3.3) -Programm, um mithilfe der POST-Methode einige Daten an eine Webseite zu senden. Meistens für den Debugging-Prozess erhalte ich das Seitenergebnis und zeige es auf dem Bildschirm mit @ aprint() Funktion.

Der Code sieht folgendermaßen aus:

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

dasHTTPResponse .read() Methode gibt ein @ zurübytes -Element, das die Seite codiert (ein gut formatiertes UTF-8-Dokument) Es schien in Ordnung zu sein, bis ich die IDLE GUI für Windows nicht mehr verwendete und stattdessen die Windows-Konsole verwendete. Die zurückgegebene Seite hat ein U + 2014-Zeichen (Bindestrich), das die Druckfunktion in der Windows-GUI gut übersetzt (ich nehme an, Codepage 1252), jedoch nicht in der Windows-Konsole (Codepage 850). Angenommenstrict Standardverhalten Ich erhalte den folgenden Fehler:

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

Ich könnte es mit diesem ziemlich hässlichen Code beheben:

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

Jetzt wird das beleidigende Zeichen "-" durch ein @ erset?. Nicht der ideale Fall (ein Bindestrich sollte ein besserer Ersatz sein), aber gut genug für meinen Zweck.

Es gibt einige Dinge, die ich an meiner Lösung nicht mag.

Der Code ist hässlich bei all dem Dekodieren, Kodieren und Dekodieren. Es löst das Problem nur für diesen Fall. Wenn ich das Programm für ein System portiere, das eine andere Codierung verwendet (latin-1, cp437, zurück zu cp1252 usw.), sollte es die Zielcodierung erkennen. Es tut nicht. (Wenn Sie zum Beispiel die IDLE-GUI erneut verwenden, geht auch der Emdash verloren, was vorher nicht passiert ist.) Es wäre schöner, wenn der Emdash in einen Bindestrich anstatt in einen Befragungsknall übersetzt würde.

Das Problem ist nicht der Emdash (ich kann mir verschiedene Möglichkeiten vorstellen, um dieses Problem zu lösen), aber ich muss robusten Code schreiben. Ich füttere die Seite mit Daten aus einer Datenbank und diese Daten können zurückkommen. Ich kann viele andere widersprüchliche Fälle vorwegnehmen: Ein 'Á' U + 00c1 (was in meiner Datenbank möglich ist) könnte in CP-850 (DOS / Windows-Konsolencodierung für westeuropäische Sprachen) übersetzt werden, nicht jedoch in CP-437 (Codierung für USA) Englisch, das in vielen Windows-Installationen standardmäßig verwendet wird.

Also, die Frage:

Gibt es eine schönere Lösung, die meinen Code von der Codierung der Ausgabeschnittstelle unabhängig macht?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage