2015-05-17 2 views
0

Я попробовал эту проблемуКак декодировать символы в Python соответственно?

# -*- coding: utf-8 -*- 
s = "Ñ ÑÑÑаÑ! Ð½ÐµÑ Ñил" 
e = s.encode('ascii') 
print e 

, но это дает мне эту ошибку.

Traceback (most recent call last): 
    File "C:/Users/username/Desktop/unicode.py", line 3, in <module> 
    e = s.encode('ascii') 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 

Как получить текст для чтения? Я пытался часами! Не знаете, как это исправить. Любая помощь будет принята с благодарностью!

+0

Какой выходной сигнал вы _expect_ здесь? – abarnert

+0

мой вывод я устаю! нет сил или любого другого иностранного языка, но и содержание содержит символы и прочее. im разбор кодов из XML-файла в Интернете. Когда я использую заголовок utf-8 в php, он отлично работает, но когда я переделал свою программу в python, это был абсолютный ад. То, что я дал вам в первом поле, - это то, что бросает мне XML-парсер.Надеюсь, я дал вам лучшее представление о том, что происходит/что мне нужно сделать. спасибо :) –

+0

Почему вы пытаетесь закодировать эту кириллицу на ASCII (которая поддерживает только текст на английском языке)? Что вы ожидали от этого? Если вы не хотите ASCII, почему вы просите об этом? – abarnert

ответ

1

У вас здесь много проблем.

Во-первых, вы застряли символы Юникода в литерал str вместо литерала unicode. Это почти всегда плохая идея.

Во-вторых, вы позвонили encode по телефону str. Но encode предназначен для преобразования unicode в str. * Для этого Python должен сначала decode вашего str до unicode, чтобы он мог позвонить encode. И если вы вынудите Python к decode для вас, не сообщив ему, какой кодек использовать, он будет использовать sys.getdefaultencoding(), что почти никогда не будет тем, что вы хотите. (В частности, это не будет UTF-8 просто потому, что ваш кодирования источника.)

Вы можете исправить эти первые две проблемы, просто добавив одну букву:

s = u"Ñ ÑÑÑаÑ! Ð½ÐµÑ Ñил" 

Но это все-таки не собирается работать. Зачем? Потому что вы просите его кодировать не-ASCII-символы в набор символов ASCII. Это невозможно. Поэтому он будет вызывать обработчик ошибок. Поскольку вы не указали обработчик ошибок, вы получаете значение по умолчанию, которое называется strict. Как следует из названия, strict вызывает исключение, когда вы просите его сделать что-то невозможное.

Другие обработчики ошибок - см. Документы str.encode для получения полного списка. Я не уверен, какой результат вы ожидали, но вы можете получить обратный слэш-текст или текст со всеми не-ASCII-символами, замененными на ? или несколькими другими возможностями. Например:

e = s.encode('ascii', 'replace') 

Конечно, если вы на самом деле не хотите ASCII, а UTF-8, то все очень просто: просто скажите Python вы хотите UTF-8 вместо ASCII:

e = s.encode('utf-8') 

* Есть несколько специальных кодеков, как hex и gzip, которые преобразовывают strstr к, unicode к unicode или str к unicode, но ascii не является одним из них.

Смежные вопросы