Я пытаюсь понять, как работает кодировка юникода в 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()
.
Эти значения уже закодированы, поэтому ..
- Что делает str () вэтот случай сейчас?
- Меняется ли представление объекта Unicode при кодировании в utf-8 ?
- Если это так, то почему
str()
пытался сначала закодировать объект Unicode в ascii (по умолчанию).