Возможные решения
Либо напишите так:
a = {"a": u"çö"}
b = "çö"
b.decode('utf-8') == a['a']
Или вот так (вы также можете пропустить .decode('utf-8')
с обеих сторон):
a = {"a": "çö"}
b = "çö"
b.decode('utf-8') == a['a'].decode('utf-8')
Или вот так (моя рекомендация):
a = {"a": u"çö"}
b = u"çö"
b == a['a']
Объяснение
Обновлено на основе комментария Тима. В вашем исходном коде, b.decode('utf-8') == u'çö'
и a['a'] == 'çö'
,так что вы на самом деле делаете следующее сравнение:
u'çö' == 'çö'
Один из объектов имеет тип unicode
, другой тип str
, поэтому для выполнения сравнения str
преобразуется в unicode
, а затем сравниваются два объекта unicode
.Он работает нормально в случае чисто ASCII-строк, например: u'a' == 'a'
, так как unicode('a') == u'a'
.
Однако, это не работает в случае u'çö' == 'çö'
, так как unicode('çö')
возвращает следующую ошибку: UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc3 в позиции 0: порядковый номер не находится в диапазоне (128) , и поэтому все сравнение возвращает значение False и выдает следующее предупреждение: UnicodeWarning: сравнение Unicodeне удалось преобразовать оба аргумента в Unicode - интерпретировать их как неравные .