PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Python + PostgreSQL + ascii estranho =erro de codificação UTF8


A questão começa com uma premissa falsa:

Os caracteres ASCII estão no intervalo "\x00" a "\x7F", inclusive.

A resposta anteriormente aceita e agora excluída operou sob dois equívocos grosseiros (1) essa localidade ==codificação (2) que a codificação latin1 mapeia "\x80" para um caractere Euro.

Na verdade, todas as codificações ISO-8859-x mapeiam "\x80" para U+0080, que é um dos caracteres de controle C1, não um caractere Euro. Apenas 3 dessas codificações (x em (7, 15, 16)) fornecem o caractere Euro, como "\xA4". Veja este artigo da Wikipedia .

Você precisa saber em qual codificação seus dados estão. Em qual máquina eles foram criados? Como? O local em que foi criado (não necessariamente o seu) pode lhe dar uma pista.

Observe que "Meus dados estão codificados em latin1" está lá em cima com "O cheque está no correio" e "Claro que vou te amar pela manhã". Seus dados provavelmente estão codificados em uma das codificações cp125x encontradas nas plataformas Windows. Observe que todos eles, exceto cp1251 (cirílico do Windows), mapeiam "\x80" para o caractere euro:
>>> ['\x80'.decode('cp125' + str(x), 'replace') for x in range(9)]
[u'\u20ac', u'\u0402', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac']

Atualizar em resposta ao comentário do OP

Isso é um pouco confuso:primeiro você diz

Mas depois você diz

Por favor explique.

Selecionando uma codificação cp125x apropriada:Onde (localização geográfica) o arquivo foi criado? Em que idioma(s) o texto está escrito? Algum caractere diferente do euro presumido com valores> "\x7f"? Em caso afirmativo, quais e em que contexto são usados?

Atualização 2 Se você não "sabe como o programa está escrito", nem você nem nós podemos formar uma opinião sobre se ele sempre usa "\x80" para o caractere euro. Embora fazer o contrário seria uma tolice monumental, isso não pode ser descartado.

Se o texto estiver escrito no idioma inglês e/ou estiver escrito nos EUA e/ou estiver escrito em uma plataforma Windows, então é razoavelmente certo que cp1252 é o caminho a seguir ... até que você obtenha evidências em contrário, caso em que você precisaria adivinhar uma codificação por si mesmo ou responder às perguntas (qual idioma, qual localidade).