PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Python + PostgreSQL + étrange ascii =erreur d'encodage UTF8

La question commence par une fausse prémisse :

Les caractères ASCII sont compris entre "\x00" et "\x7F" inclus.

La réponse précédemment acceptée et maintenant supprimée fonctionnait sous deux grossières erreurs d'interprétation (1) que locale ==encoding (2) que l'encodage latin1 mappe "\x80" sur un caractère Euro.

En fait, tous les encodages ISO-8859-x mappent "\x80" à U+0080 qui est l'un des caractères de contrôle C1, pas un caractère Euro. Seuls 3 de ces encodages (x dans (7, 15, 16)) fournissent le caractère Euro, sous la forme "\xA4". Voir cet article Wikipédia .

Vous devez savoir dans quel encodage se trouvent vos données. Sur quelle machine ont-elles été créées ? Comment? Les paramètres régionaux dans lesquels il a été créé (pas nécessairement les vôtres) peuvent vous donner un indice.

Notez que "Mes données sont encodées en latin1" est là-haut avec "Le chèque est dans le courrier" et "Bien sûr que je t'aimerai demain matin". Vos données sont probablement encodées dans l'un des encodages cp125x trouvés sur les plates-formes Windows. Notez que tous sauf cp1251 (Windows Cyrillic) mappent "\x80" au caractère 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']

Mettre à jour en réponse au commentaire de l'OP

C'est un peu déroutant :d'abord, vous dites

Mais plus tard tu dis

Veuillez expliquer.

Sélection d'un encodage cp125x approprié :où (emplacement géographique) le fichier a-t-il été créé ? Dans quelle(s) langue(s) le texte est-il écrit ? Des caractères autres que l'euro présumé avec des valeurs> "\x7f" ? Si oui, lesquelles et dans quel contexte sont-elles utilisées ?

Mise à jour 2 Si vous ne "savez pas comment le programme est écrit", ni vous ni nous ne pouvons nous faire une opinion sur le fait qu'il utilise toujours "\x80" pour le caractère euro. Bien que faire autrement serait une bêtise monumentale, cela ne peut être exclu.

Si le texte est écrit en anglais et/ou s'il est écrit aux États-Unis et/ou s'il est écrit sur une plate-forme Windows, alors il est raisonnablement certain que cp1252 est la voie à suivre ... jusqu'à ce que vous obteniez la preuve du contraire, auquel cas vous devrez deviner un encodage par vous-même ou répondre aux questions (quelle langue, quelle localité).