PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Python + PostgreSQL + strano ascii =errore di codifica UTF8

La domanda inizia con una premessa falsa:

I caratteri ASCII sono compresi tra "\x00" e "\x7F" inclusi.

La risposta precedentemente accettata e ora eliminata ha operato con due gravi malintesi (1) che locale ==codifica (2) che la codifica latin1 associa "\x80" a un carattere Euro.

In effetti, tutte le codifiche ISO-8859-x mappano "\x80" su U+0080 che è uno dei caratteri di controllo C1, non un carattere Euro. Solo 3 di queste codifiche (x in (7, 15, 16)) forniscono il carattere Euro, come "\xA4". Vedi questo articolo di Wikipedia .

Devi sapere in quale codifica si trovano i tuoi dati. Su quale macchina è stato creato? Come? Il locale in cui è stato creato (non necessariamente il tuo) potrebbe darti un indizio.

Nota che "I miei dati sono codificati in latin1" è lassù con "L'assegno è nella posta" e "Certo che ti amerò domattina". I tuoi dati sono probabilmente codificati in una delle codifiche cp125x presenti sulle piattaforme Windows. Nota che tutti tranne cp1251 (Windows Cyrillic) associano "\x80" al carattere 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']

Aggiorna in risposta al commento del PO

Questo è un po' confuso:per prima cosa dici

Ma dopo dici

Per favore, spiega.

Selezione di una codifica cp125x appropriata:dove (posizione geografica) è stato creato il file? In quale/e lingua/e è scritto il testo? Qualche carattere diverso dal presunto euro con valori> "\x7f"? Se sì, in quali e in quale contesto vengono utilizzati?

Aggiorna 2 Se non "sai come è scritto il programma", né tu né noi possiamo formarci un'opinione sul fatto che utilizzi sempre "\x80" per il carattere euro. Anche se fare diversamente sarebbe una sciocchezza monumentale, non può essere escluso.

Se il testo è scritto in lingua inglese e/o è scritto negli USA e/o è scritto su piattaforma Windows, allora è ragionevolmente certo che cp1252 è la strada da percorrere ... fino a quando non ottieni prove contrarie, nel qual caso dovresti indovinare una codifica da solo o rispondere alle domande (quale lingua, quale località).