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