Преобразование 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) 

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

  • Почему этот HTML-шаблон на jinja2 / python создает ошибку 'u ()' tuple при замене строк?
  • декодирование-кодирование UTF-8 не приводит к исходному юникоду
  • Кодирование Python - не удалось декодировать до utf8
  • Запись CSV-файла с помощью умляутов, вызывающих «кодек UnicodeEncodeError: 'ascii', не может кодировать символ"
  • Python и UTF-8: что-то путать
  • UTF-8 и os.listdir ()
  • Лучший способ конвертировать URL-адрес Unicode в ASCII (UTF-8-escaped) в Python?
  • Python конвертирует html ascii-кодированный текст в utf8
  •  
    Interesting Posts for Van-Lav

    Использование Python для программирования макросов MS Office?

    Запуск mnist_softmax.py в Tensorflow, установленном с помощью Docker

    python автоматизирует преобразование ffmpeg из каталога загрузки

    Возможно ли создать агрегацию в Pymongo без таймаута для курсора?

    Подсчитайте количество строк в txt-файле с помощью Python, исключая пустые строки

    Python NameError из содержимого переменной

    Можно ли показать точное положение в Sublime Text 2?

    Взаимодействие cuSOLVER-разреженное использование PyCUDA

    Django STATIC_URL не работает

    Размещение дочернего окна относительно родителя в Python Tkinter

    Есть ли способ выполнить наведение мыши (наведите указатель мыши на элемент), используя привязки Selenium и Python?

    Реструктуризация Dataframe

    Python matplotlib изменяет цвет по умолчанию для значений, превышающих диапазон цветовых штрихов

    Ведение журнала и / или stdout / stderr в Python Daemon

    Как вызвать метод python из класса java?

    Python - лучший язык программирования в мире.