UnicodeEncodeError: kodek „charmap” nie może zakodować - znaki są odwzorowywane na <zdefiniowane>, funkcja drukowania [duplikat]

To pytanie ma już odpowiedź tutaj:

Python, Unicode i konsola Windows 13 odpowiedzi

Piszę program w języku Python (Python 3.3), który wysyła dane na stronę internetową przy użyciu metody POST. Głównie do procesu debugowania otrzymuję wynik strony i wyświetlam go na ekranie za pomocąprint()unkcja

Kod jest taki:

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

theHTTPResponse .read()etoda @ zwraca wartośćbyteslement @ kodujący stronę (który jest dobrze sformatowanym dokumentem UTF-8) Wydawało się być w porządku, dopóki nie przestałem używać interfejsu IDLE GUI dla systemu Windows i zamiast tego użyłem konsoli Windows. Zwrócona strona ma znak U + 2014 (em-dash), który funkcja drukowania dobrze tłumaczy w graficznym interfejsie użytkownika systemu Windows (zakładam, że strona kodowa 1252), ale nie ma go w konsoli systemu Windows (strona kodowa 850). Biorąc pod uwagęstrict zachowanie domyślne Otrzymuję następujący błąd:

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

Mogę to naprawić za pomocą tego dość brzydkiego kodu:

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

Teraz zamień obrażający znak „-” na?. Nie jest to idealny przypadek (myślnik powinien być lepszym zamiennikiem), ale wystarczająco dobry dla mojego celu.

Istnieje kilka rzeczy, których nie lubię w moim rozwiązaniu.

Kod jest brzydki z całym tym dekodowaniem, kodowaniem i dekodowaniem. Rozwiązuje problem tylko w tym przypadku. Jeśli portuję program dla systemu wykorzystującego inne kodowanie (latin-1, cp437, powrót do cp1252 itp.), Powinien rozpoznać kodowanie docelowe. To nie. (na przykład przy ponownym użyciu interfejsu IDLE GUI interfejs emdash również zostaje utracony, co wcześniej nie miało miejsca) Byłoby ładniej, gdyby emdash został przetłumaczony na myślnik zamiast huku zapytania.

Problemem nie jest emdash (mogę wymyślić kilka sposobów rozwiązania tego szczególnie problemu), ale muszę napisać solidny kod. Karmię stronę danymi z bazy danych i dane te mogą wrócić. Mogę przewidzieć wiele innych sprzecznych przypadków: „Á” U + 00c1 (co jest możliwe w mojej bazie danych) może tłumaczyć na CP-850 (kodowanie DOS / Windows Console dla języków zachodnioeuropejskich), ale nie na CP-437 (kodowanie dla USA Angielski, który jest domyślny w wielu instalacjach Windows).

Tak więc pytanie:

Czy istnieje lepsze rozwiązanie, które powoduje, że mój kod jest agnostyczny z kodowania interfejsu wyjściowego?

questionAnswers(6)

yourAnswerToTheQuestion