Question

>>> teststring = 'aõ'
>>> type(teststring)
<type 'str'>
>>> teststring
'a\xf5'
>>> print teststring
aõ
>>> teststring.decode("ascii", "ignore")
u'a'
>>> teststring.decode("ascii", "ignore").encode("ascii")
'a'

qui est ce que je voulais vraiment à stocker en interne comme je supprimer les caractères non-ascii. Pourquoi le decode ( "ascii donner une chaîne de caractères Unicode?

>>> teststringUni = u'aõ'
>>> type(teststringUni)
<type 'unicode'>
>>> print teststringUni
aõ
>>> teststringUni.decode("ascii" , "ignore")

Traceback (most recent call last):
  File "<pyshell#79>", line 1, in <module>
    teststringUni.decode("ascii" , "ignore")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128)
>>> teststringUni.decode("utf-8" , "ignore")

Traceback (most recent call last):
  File "<pyshell#81>", line 1, in <module>
    teststringUni.decode("utf-8" , "ignore")
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128)
>>> teststringUni.encode("ascii" , "ignore")
'a'

Ce qui est encore une fois ce que je voulais. Je ne comprends pas ce comportement. Quelqu'un peut-il me expliquer ce qui se passe ici?

modifier Je pensais que cela me comprendre les choses pour que je puisse résoudre mon problème réel du programme que je déclare ici: Conversion d'objets Unicode avec non symboles ASCII dans les objets en cordes (en Python)

Était-ce utile?

La solution

Il est simple:. .Encode convertit des objets Unicode en chaînes, et .decode convertit les chaînes en Unicode

Autres conseils

  

Pourquoi le decode ( "ascii") donner une chaîne unicode?

Parce que ce decode est pour :. Il décode les chaînes d'octets comme votre un ASCII en unicode

Dans votre deuxième exemple, vous essayez de « décoder » une chaîne qui est déjà unicode, qui n'a pas d'effet. Pour imprimer à votre terminal, cependant, Python doit coder comme l'encodage par défaut, ce qui est ASCII - mais parce que vous avez pas fait pas explicitement et par conséquent n'a pas spécifié le paramètre « ignorer », il soulève l'erreur qu'il ne peut pas coder les caractères non-ASCII.

L'astuce de tout cela est de rappeler que decode prend une chaîne d'octets encodée et le convertit en Unicode, et encode fait l'inverse. Il pourrait être plus facile si vous comprenez que Unicode n'est pas un encodage .

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