Suppression de caractères non-ASCII à partir de tout stringtype donné dans le python
-
01-10-2019 - |
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)
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 .