Unicode latin1 chaîne de codage / décodage

Lors de l'extraction de données à partir d'un inconnu/old/non-conforme Mysql base de données Postgres utf-8 db à l'aide de Python (Django) ORM j'ai parfois défectueuse des données codées.

Cible: grégory

> a
u'gr\xe3\xa9gory'

> print a
grã©gory

J'ai essayé plusieurs décoder/encoder des trucs sans succès:

 > print a.encode('utf-8').decode('latin1')
 grã©gory

 > print a.encode('utf-8').decode('latin1')
 grã©gory

 > print a.decode('latin-1')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)

Même avec un peu d'
unicode_escape

Comment allez-vous récupérer les données? Vous avez une unicode cas, il existe avec le mauvais de caractères qu'il; vous voulez résoudre le décodage de l'étape qui a produit a en premier lieu. Le code dont vous faites preuve est arrive trop tard.
Les données, même si on l'interprète comme des octets au lieu de l'unicode, n'est pas valide UTF8. E3 A9 n'est pas jamais rencontré dans ce type d'encodage.
Ceci devrait vous aider avec unicode python 2.x; c'est la "unicode sandwich" de parler.
Quelle est la bonne Unicode codepoint pour ces deux octets? On peut probablement comprendre ce qui s'est passé ici, mais sans savoir ce que le correct interprétation serait qu'il est presque impossible de le reconstruire.
Dernier mais non le moindre, codage Latin-1 préserver au moins la 'octets'; des points de code unicode de 0 à 255 sont codés d'octets avec des valeurs correspondantes, de sorte que vous pouvez ensuite ré-interpréter les octets comme un codage différent à la place.

OriginalL'auteur coulix | 2013-02-13