Удаление не-ascii символов из любого заданного типа строки в Python - PullRequest
4 голосов
/ 08 сентября 2010
>>> 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'

Это то, что я действительно хотел, чтобы он хранился внутри, так как я удаляю не-ascii символы. Почему декодирование ("ascii выдает строку в юникоде?

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

Что опять то, что я хотел. Я не понимаю это поведение. Может кто-нибудь объяснить мне, что здесь происходит?

edit: Я думал, что это поможет мне понять вещи, чтобы я мог решить мою настоящую программную проблему, которую я здесь заявляю: Преобразование объектов Unicode с не-ASCII-символами в них в строковые объекты (в Python)

Ответы [ 2 ]

4 голосов
/ 08 сентября 2010

Все просто: .encode преобразует объекты Unicode в строки, а .decode преобразует строки в Unicode.

4 голосов
/ 08 сентября 2010

Почему декодер ("ascii") выдает строку в юникоде?

Потому что это то, что decode равно для : он декодирует байтовые строки наподобиеваш ASCII-код в Unicode.

Во втором примере вы пытаетесь «расшифровать» строку, которая уже является Unicode, но не имеет никакого эффекта.Однако, чтобы распечатать его на вашем терминале, Python должен закодировать его как кодировку по умолчанию, то есть ASCII - но поскольку вы не сделали этот шаг явно и, следовательно, не указали параметр «ignore», он вызывает ошибку, что онне может кодировать символы, не входящие в ASCII.

Хитрость во всем этом заключается в том, чтобы помнить, что decode принимает закодированную строку тестирования и преобразует ее в Unicode, а encode делает обратное.Может быть проще, если вы понимаете, что Юникод не является кодировкой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...