Кодировка Юникода с Python - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь понять, как работает кодировка юникода в python2.7, но пока легко найти решение, но я не нашел четкого объяснения тому, что здесь происходит.Вот пример.

Введение

У нас есть полученная нами переменная Юникод, которая называется filter_type filter_type = u'some_välüe'.

Мы помещаем это впродиктуйте и передайте это в библиотеку python urllib.urlencode .

Примерно так:

urllib.urlencode({"param:" ..., "filter_type": filter_type}

Эта проблема.

Внутри urllib.urlencode он зацикливается на данных, передаваемых ему, и упаковывает ключи и значения во встроенную функцию str(), чтобы получить строковое представление каждого ключа и значения перед его кодированием в URL.

Мыполучите ошибку, подобную следующей: {UnicodeEncodeError}'ascii' codec can't encode character u'\xf1' in position 42: ordinal not in range(128).

Вы получите эту же ошибку, выполнив str(u'some_välüe').

Так что после некоторого исследования и копания это выглядит, как когда вы переносите Unicodeзначения в str() он пытается закодировать значение в заданную кодировку по умолчанию.(мое предположение)

>>> import sys
>>> sys.getdefaultencoding()
ascii

Решение.

Таким образом, мы можем исправить это, кодируя эти строки Юникода с помощью utf-8 .
filter_type = u'some_välüe'.encode('utf-8').

Вопрос.

Но вот вопрос.Ранее я упоминал, что urllib.urlencode оборачивает ключи и значения в функцию str().

Эти значения уже закодированы, поэтому ..

  1. Что делает str () вэтот случай сейчас?
  2. Меняется ли представление объекта Unicode при кодировании в utf-8 ?
  3. Если это так, то почему str() пытался сначала закодировать объект Unicode в ascii (по умолчанию).
...