2010-09-08 10 views
4
>>> 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' 

Ce qui est ce que je voulais vraiment stocker en interne lorsque je supprime des caractères non-ASCII. Pourquoi le decode ("ascii donner une chaîne unicode?Suppression des caractères non-ascii d'un type donné en Python

>>> 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?

edit: 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: Converting Unicode objects with non-ASCII symbols in them into strings objects (in Python)

Répondre

4

C'est simple: .encode convertit les objets Unicode en chaînes, et .decode convertit les chaînes en Unicode.

+0

cette perspective l'a effectivement résolu =), merci – fullmooninu

+0

si cela ne fonctionne pas, essayez aussi d'utiliser BeautifulSoup (html) .encode pour html ou le module regex –

4

Pourquoi le decode (« ascii ») donnent une chaîne de caractères unicode

Parce que ce decode est pour: il décode les chaînes d'octets comme votre ASCII un en unicode. Dans votre deuxième exemple, vous essayez de "décoder" une chaîne qui est déjà unicode, ce qui n'a aucun effet. Pour l'imprimer sur votre terminal, Python doit l'encoder comme votre encodage par défaut, qui est ASCII - mais comme vous n'avez pas explicitement fait cette étape et n'avez donc pas spécifié le paramètre 'ignore', cela soulève l'erreur qu'il ne peut pas encoder les caractères non-ASCII.

L'astuce à tout cela est de se rappeler que decode prend un bytestring codé et le convertit en Unicode, et encode fait l'inverse. Cela peut être plus facile si vous comprenez que Unicode n'est pas un codage.

+0

Eh bien, vous avez raison, sauf pour certains détails. Puisqu'il peut imprimer '' a \ xf5'' correctement, son encodage des terminaux n'est pas ascii mais .. quelque chose d'autre. L'encodage de la console est un problème très commun, mais ce n'est pas le cas cette fois. En outre, 'teststringUni.decode (" ascii "," ignore ")' n'échoue pas lorsque vous essayez d'imprimer le résultat. Il indique à Python que teststringUni est une chaîne codée en ASCII (il est clairement unicode, mais Python fait confiance à l'utilisateur) et essaie de le décoder - ce qui ne peut pas fonctionner. –

+0

oui, je pense que c'est le problème: quel est mon encodage terminal? Juste parce qu'un type d'objet est une chaîne, cela ne veut pas dire que l'encodage est ascii, je l'ai compris. Mon problème maintenant est de comprendre comment je peux traduire quelque chose qui a un type unicode dans le type de chaîne du terminal, tout en conservant toutes les informations. – fullmooninu