Suppression des caractères non-ascii d'un type de chaîne donné en Python

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

qui est ce que je voulais vraiment qu'il stocke en interne que je supprime les caractères non-ascii. Pourquoi le décodage ("ascii donner une chaîne 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:Python27libencodingsutf_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'

C'est encore ce que je voulais. Je ne comprends pas ce comportement. Quelqu'un peut m'expliquer ce qui se passe ici?

edit: je pensais que ce serait me faire comprendre les choses afin que je puisse résoudre mon problème de programme que je dis ici: conversion d'objets Unicode avec des symboles non ASCII en objets strings (en Python)

4
demandé sur Community 2010-09-08 16:49:11

2 réponses

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

4
répondu Ned Batchelder 2010-09-08 13:25:39

pourquoi le décodage ("ascii") a-t-il donné une chaîne unicode?

parce que c'est ce que decode veut dire pour : il décode les chaînes d'octets comme votre ASCII 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, cependant, Python doit l'encoder comme votre encodage par défaut, qui est ASCII - mais parce que vous n'avez pas fait cette étape explicitement et donc n'avez pas spécifié le paramètre "Ignorer", il soulève l'erreur qu'il ne peut pas encoder les caractères non-ASCII.

l'astuce pour tout cela est de se rappeler que decode prend un bytestring encodé 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 .

4
répondu Daniel Roseman 2010-09-08 13:45:48