Преобразование Unicode в python

Возможный дубликат:
Преобразование Unicode в UTF-8 Python

Я очень новый программист на python, работая над своим первым скриптом. сценарий вытягивает текст из строки plist, затем делает некоторые вещи, а затем упаковывает его как HTML-адрес электронной почты.

из нескольких записей, я получаю ужасную ошибку Unicode за пределами порядкового номера 128.

Прочитав столько, сколько я могу найти о кодировании и расшифровке, я знаю, что для меня важно получить кодировку, но мне сложно понять, когда и как именно это сделать.

Оскорбительная переменная сначала извлекается с использованием plistlib и преобразуется в HTML из уценки, например:

entry = result['Entry Text'] donotecontent = markdown2.markdown(entry) 

Позже он помещается в электронную почту следующим образом:

 html = donotecontent + '<br /><br />' + var3 part1 = MIMEText(html, 'html') msg.attach(part1) 

Мой вопрос в том, что для меня лучший способ убедиться, что символы Unicode в этом контенте не приводят к ошибке. Я предпочитаю не игнорировать персонажей.

3 Solutions collect form web for “Преобразование Unicode в python”

Извините за мой сломанный английский. Я говорю на китайском / японском языке и ежедневно пользуюсь персонажами CJK. Ceron решил почти эту проблему, поэтому я не буду говорить о том, как снова использовать encode () / decode ().

Когда мы используем str () для создания любого объекта unicode, он будет кодировать строку unicode в bytedata; когда мы используем unicode () для создания str-объекта, он будет декодировать bytedata для символа unicode.

И кодировка должна быть тем, что было возвращено из sys.getdefaultencoding ().

По умолчанию sys.getdefaultencoding () возвращает 'ascii' по умолчанию, исключение кодирования / декодирования может быть выбрано при выполнении str () / unicode ().

Если вы хотите выполнить преобразование str <-> unicode по str () или unicode (), а также кодирование / декодирование implicity с помощью «utf-8», вы можете выполнить следующее заявление:

 import sys # sys.setdefaultencoding is cancelled by site.py reload(sys) # to re-enable sys.setdefaultencoding() sys.setdefaultencoding('utf-8') 

и это приведет к последующему исполнению str () и unicode (), конвертирует любой объект basestring с кодировкой utf-8

Тем не менее, я бы предпочел явно использовать encode () / decode (), потому что упрощает прохождение кода для меня.

Предполагая, что вы используете Python 2.x, помните: есть два типа строк: str и unicode . str являются байтовыми строками, тогда как unicode – это строки unicode. Строки unicode могут использоваться для представления текста на любом языке, но для хранения текста на компьютере или отправки его по электронной почте вам необходимо представить этот текст с использованием байтов. Для представления текста с использованием байтов вам нужен формат кодирования. Существует много форматов кодирования, по умолчанию Python использует ascii , но ascii может представлять только несколько символов, в основном английские буквы. Если вы попытаетесь закодировать текст другими буквами с помощью ascii , вы получите знаменитый «внешний порядковый номер 128». Например:

 >>> u'Cerón'.encode('ascii') Traceback (most recent call last): File "<input>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 3: ordinal not in range(128) 

То же самое происходит, если вы используете str(u'Cerón') , потому что Python по умолчанию использует ascii для преобразования unicode в str .

Чтобы сделать эту работу, вы должны использовать другой формат кодирования. UTF-8 – это формат кодирования, который может выражать любой текст в формате Юникод в виде байтов. Чтобы преобразовать u'Cerón' unicode u'Cerón' в байты, которые вы должны использовать:

 >>> u'Cerón'.encode('utf-8') 'Cer\xc3\xb3n' 

На этот раз ошибок нет.

Теперь вернемся к вашей проблеме с электронной почтой. Я вижу, что вы используете MIMEText , который принимает уже закодированный аргумент str , в вашем случае это переменная html . MIMEText также принимает аргумент, определяющий, какой тип кодирования используется. Итак, в вашем случае, если html является строкой unicode, вы должны закодировать ее как utf-8 и передать параметр charset (потому что HTMLText использует ascii по умолчанию):

 part1 = MIMEText(html.encode('utf-8'), 'html', 'utf-8') 

Но будьте осторожны, потому что если html уже является str а не unicode , тогда кодирование завершится неудачно. Это одна из проблем Python 2.x, она позволяет кодировать уже закодированную строку, но она выдает ошибку.

Еще одна проблема, которую нужно добавить в список, заключается в том, что utf-8 совместим с символами ascii , и Python всегда будет пытаться автоматически кодировать / декодировать строки с помощью ascii . Если вы неправильно кодируете свои строки, но используете только символы ascii , все будет работать нормально. Однако, если по какой-то причине некоторые символы не-ascii проскальзывают в ваше сообщение, вы получите сообщение об ошибке, что затрудняет обнаружение ошибок.

Помните: вы не можете декодировать юникод, и вы не можете кодировать строку

 >>> u"\xa0".decode("ascii", "ignore") Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> u"\xa0".decode("ascii", "ignore") UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 0: ordinal not in range(128) >>> "\xc2".encode("ascii", "ignore") Traceback (most recent call last): File "<pyshell#6>", line 1, in <module> "\xc2".encode("ascii", "ignore") UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128) 

Оформить этот отличный учебник

  • Строковые кодировки Python и ==
  • Ansi для UTF-8 с использованием ошибки python
  • Разбор строк UTF-8 / unicode с lxml HTML
  • Сделайте Emacs использовать UTF-8 с интерактивным режимом Python
  • Как искать и заменять специальные символы utf-8 в Python?
  • Функция print () Python 3 с символами фарси / арабский
  • Как декодировать строку, представляющую utf-8 с помощью python?
  • Как правильно вставить символы utf-8 в таблицу MySQL с помощью python
  • Создайте файл csv utf-8 в Python
  • печать UTF-8 в Python 3 с использованием Sublime Text 3
  • Юникод не поддерживается Python
  • Python - лучший язык программирования в мире.