Question

Ceci est en python 2.4. Voici ma situation. Je tire une chaîne à partir d'une base de données, et il contient un tréma « o » (\ XF6). À ce stade, si je lance le type (valeur), elle retourne str. Je tente alors d'exécuter .decode ( « utf8 »), et je reçois une erreur (codec « utf8 » ne peut pas décoder les octets en position de 1-4).

vraiment mon objectif ici est juste pour le type (valeur) unicode de retour avec succès. J'ai trouvé un question précédente qui avait des informations utiles, mais l'exemple de la réponse choisi ne semble pas fonctionner pour moi. Y at-il quelque chose que je fais mal ici?

Voici un code à reproduire:

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

Je ne fait obtenir la déclaration d'écriture, car elle échoue sur la première déclaration.

Merci pour votre aide.

Modifier

J'ai vérifié que le charset est UTF8 du DB. Donc, dans mon code pour reproduire je l'ai changé « \ XF6 » à « \ xc3 \ XB6 », et l'échec se produit encore. Y at-il une différence entre 'UTF8' et 'UTF8'?

La pointe sur l'utilisation de codecs pour écrire dans un fichier est à portée de main (je vais certainement l'utiliser), mais dans ce scénario je ne suis en train d'écrire dans un fichier journal pour des fins de débogage.

Était-ce utile?

La solution

  

Donc, dans mon code pour reproduire je l'ai changé '\ XF6' à '\ xc3 \ XB6', et l'échec se produit encore

Non dans la première ligne, il ne fait pas:

>>> 'w\xc3\xb6rner'.decode('utf-8')
u'w\xf6rner'

La deuxième ligne d'erreur sur si:

>>> file.write('Name: %s - %s\n' %(Name, type(Name)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

Ce qui est tout à fait ce que vous attendez, en essayant d'écrire des caractères non-ASCII Unicode à un flux d'octets. Si vous utilisez la suggestion d'un flux enveloppé de codecs de Jiri vous pouvez écrire directement Unicode, sinon vous devrez ré-encoder la chaîne Unicode en octets manuellement.

Mieux, à des fins d'exploitation forestière, serait tout simplement cracher un repr () de la variable. Ensuite, vous n'avez pas à vous soucier des caractères Unicode étant là-dedans, ou des sauts de ligne ou d'autres caractères indésirables:

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'

Autres conseils

Votre chaîne est pas dans le codage UTF8. Si vous voulez chaîne « décoder » à unicode, votre chaîne doit être en vous encodage spécifié par le paramètre. J'ai essayé et il fonctionne parfaitement:

print 'w\xf6rner'.decode('cp1250')

EDIT

Pour écrire des chaînes unicode au fichier que vous pouvez utiliser le module de codecs:

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

Il est utile de spécifier le codage de l'entrée / sortie et en utilisant la chaîne « unicode » tout au long de votre code sans prendre la peine de différents codages.

Il est évidemment le codage 1 octet. 'O' en UTF-8 est '\ xc3 \ XB6.

L'encodage peut-être:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252

Vous devez utiliser "ISO-8859-1":

Name = 'w\xf6rner'.decode('iso-8859-1')
file.write('Name: %s - %s\n' %(Name, type(Name)))

utf-8 utilise 2 octets pour échapper à quoi que ce soit en dehors ascii, mais ici il est juste 1 octet, donc iso-8859-1 est probablement correct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top