UnicodeEncodeError: o codec 'charmap' não pode codificar - mapas de caracteres para <não definido>, função de impressão [duplicada]

Esta pergunta já tem uma resposta aqui:

Python, Unicode e o console do Windows 3 respostas

Estou escrevendo um programa Python (Python 3.3) para enviar alguns dados para uma página da Web usando o método POST. Principalmente no processo de depuração, estou obtendo o resultado da página e exibindo-o na tela usandoprint() função.

O código é assim:

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

aHTTPResponse .read() método @ retorna umbytes elemento que codifica a página (que é um documento UTF-8 bem formatado) Parecia bom até que parei de usar o IDLE GUI para Windows e usei o console do Windows. A página retornada possui um caractere U + 2014 (traço), que a função de impressão traduz bem na GUI do Windows (presumo a Página de Código 1252), mas não no Console do Windows (Página de Código 850). Considerando astrict comportamento padrão, recebo o seguinte erro:

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

Eu poderia corrigi-lo usando este código bastante feio:

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

Agora substitua o caractere ofensivo "-" por um?. Não é o caso ideal (um hífen deve ser um substituto melhor), mas é bom o suficiente para o meu objetiv

Há várias coisas que eu não gosto na minha soluçã

O código é feio com toda essa decodificação, codificação e decodificaçã Resolve o problema apenas neste caso. Se eu portar o programa para um sistema usando alguma outra codificação (latin-1, cp437, de volta a cp1252 etc.), ele deverá reconhecer a codificação de destino. Isso não. (por exemplo, ao usar novamente a GUI IDLE, o emdash também é perdido, o que não havia acontecido antes) Seria melhor se o emdash fosse traduzido para um hífen em vez de um estrondo de interrogaçã

O problema não é o emdash (posso pensar em várias maneiras de resolver esse problema particularmente), mas preciso escrever um código robusto. Estou alimentando a página com dados de um banco de dados e esses dados podem voltar. Posso prever muitos outros casos conflitantes: um 'Á' U + 00c1 (que é possível no meu banco de dados) pode ser traduzido para CP-850 (codificação DOS / Windows Console para idiomas da Europa Ocidental), mas não para CP-437 (codificação para US Inglês, que é o padrão em muitas instalações do Windows

Então, a pergunta:

xiste uma solução melhor que torna meu código independente da codificação da interface de saíd

questionAnswers(6)

yourAnswerToTheQuestion