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
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.
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
Vous devez vous connecter pour publier un commentaire.
Je suppose que la chaîne a été mal converties en minuscules, à un certain point, la modification de
\xc3
à\xe3
. Les minuscules conversion a assumé l'encodage latin1 lorsqu'il était en fait en utf-8.En effet, je ne le bas() sur la prochaine chaîne. Je vais essayer de remédier à l'encodage/décodage à l'insérer niveau lors de la lecture de Mysql. Merci !
qui est d'une importance primordiale détails là-bas; pourquoi minuscules cassé les données avant de les réparer en premier?
OriginalL'auteur Janne Karila
Depuis le problème a été la plus faible(), j'ai pu le résoudre en faisant:
'Abcd'.lower().upper()
n'est pas la même chose que'Abcd'
. L'OP ne doit pas mettre en minuscule les données avant de le fixer en premier lieu.Et de le rendre plus explicite: Il y a beaucoup d'partielle octets UTF-8 qui peut être interprété comme le Latin-1 en minuscules caractères, majuscules et ceux qui va briser ces octets au lieu. L'appel de
.upper()
vont vous présenter de plus erreurs.OriginalL'auteur coulix
Essayez ceci:
a
est ununicode
de l'objet; l'appel de.decode()
implique qu'il n'y a qu'un.encode()
premier. Ce que les données devraient être codé pour dans ce cas? Python par défaut au format ASCII, et qui va échouer pour l'E3 et A9 octets.OriginalL'auteur Ravi Maggon