UnicodeEncodeError: el códec 'charmap' no puede codificar - los mapas de caracteres a <undefined>, función de impresión [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Python, Unicode y la consola de Windows 13 respuestas

Estoy escribiendo un programa Python (Python 3.3) para enviar algunos datos a una página web utilizando el método POST. Principalmente para el proceso de depuración, obtengo el resultado de la página y lo visualizo en la pantalla usandoprint() función.

El código es así:

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

elHTTPResponse .read()l método @ devuelve unabytes elemento que codifica la página (que es un documento UTF-8 bien formateado) Parecía estar bien hasta que dejé de usar IDLE GUI para Windows y usé la consola de Windows. La página devuelta tiene un carácter U + 2014 (em-dash) que la función de impresión se traduce bien en la GUI de Windows (supongo que la página de códigos 1252) pero no en la consola de Windows (página de códigos 850). Dado questrict comportamiento predeterminado me sale el siguiente error:

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

Podría arreglarlo usando este código bastante feo:

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

Ahora reemplaza el carácter ofensivo "-" con una?. No es el caso ideal (un guión debería ser un mejor reemplazo) pero es lo suficientemente bueno para mi propósito.

Hay varias cosas que no me gustan de mi solución.

l código es feo con toda esa decodificación, codificación y decodificación. Resuelve el problema solo para este caso. Si porto el programa para un sistema que usa otra codificación (latin-1, cp437, de regreso a cp1252, etc.), debería reconocer la codificación de destino. No es asi. (por ejemplo, al usar nuevamente la GUI IDLE, el emdash también se pierde, lo que no sucedió antes)ería mejor si el emdash se tradujera en un guión en lugar de una explosión de interrogación.

El problema no es el emdash (puedo pensar en varias formas de resolver ese problema en particular) pero necesito escribir un código robusto. Estoy alimentando la página con datos de una base de datos y esos datos pueden volver. Puedo anticipar muchos otros casos conflictivos: un 'Á' U + 00c1 (que es posible en mi base de datos) podría traducirse en CP-850 (codificación de consola de DOS / Windows para idiomas de Europa occidental) pero no en CP-437 (codificación para EE. UU. Inglés, que es el predeterminado en muchas instalaciones de Windows).

Entonces, la pregunta:

Existe una mejor solución que haga que mi código sea independiente de la codificación de la interfaz de salida?

Respuestas a la pregunta(6)

Su respuesta a la pregunta