a = {"a":"çö"}
b = "çö"
a['a']
>>> '\xc3\xa7\xc3\xb6'
b.decode('utf-8') == a['a']
>>> False
Что идет туда?
отредактируйте =, я сожалею, это была моя ошибка. Это все еще Ложно. Я использую Python 2.6 на Ubuntu 10.04.
Либо напишите так:
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'çö' == 'çö'
One объектов имеет тип unicode
, другой - тип str
, поэтому для выполнения сравнения str
преобразуется в unicode
, а затем сравниваются два объекта unicode
. Он отлично работает в случае чисто ASCII-строк, например: u'a '==' a '
, поскольку unicode (' a ') == u'a'
.
Однако он не работает в случае u'çö '==' çö '
, поскольку unicode (' çö ')
возвращает следующую ошибку: UnicodeDecodeError:' ascii 'кодек не может декодировать байт 0xc3 в позиции 0: порядковый номер не в диапазоне (128) , и поэтому все сравнение возвращает False и выдает следующее предупреждение: UnicodeWarning: при равном сравнении Unicode не удалось преобразовать оба аргумента в Unicode - интерпретируя их как неравные .
b
- это string
, a
- это dict
Вы хотите (я полагаю):
b == a['a']
UTF-8 - это кодировка, используемая для записи текста Unicode в файлы. Однако в Python вы работаете с объектами, которые имеют фиксированный способ представления текста Unicode, и это не UTF-8.
Вы все еще можете сравнивать строки Unicode в Python, но это не связано с UTF-8, за исключением того, что если вы хотите поместить константы в эти строки Unicode, вам нужно будет закодировать текст файла, содержащего ваш исходный код, в UTF-8. Как только оператор присваивания выполняется, строка перестает соответствовать UTF-8, а является внутренним представлением Python.
Кстати, если вы выполняете сравнение с Unicode, вы, вероятно, захотите использовать модуль unicodedata и нормализовать строки перед выполнением сравнения.
Вы сравниваете строку с dict.
>>> a = {"a":"çö"}
>>> b = "çö"
>>> a == b
False
>>> a['a'] == b
True
Если вы сравните строку (b) с членом a (a ['a']), то получите желаемый результат.
Убедитесь, что ваш код находится в UTF-8 (НЕ Latin-1) и / или используйте следующую строку кодирования:
#! /usr/bin/python
# -*- coding: utf-8 -*-
a = {"a": u"çö"}
b = "çö"
assert b == a['a']
assert b.decode('utf-8') == a['a'].decode('utf-8')
Если вы используете Unicode повсеместно, вы можете импортировать unicode_literals из будущего и сократить страдания от кодирования:
#! /usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
a = {"a": u"çö"}
b = "çö"
assert b == a['a']
assert b == a['a']
assert b.encode('utf-8') != a['a']
assert b.encode('utf-8') == a['a'].encode('utf-8')
Если файл использует unicode_literals, все «строки» теперь являются объектами «unicode» (согласно кодировке файла), если они не «добавлены» с помощью ab (для имитации разделения строки / байтов в Python 3.X).
NullUserException правильно, что это должно быть правильно:
b == a['a']
Вы все еще получаете «False», потому что вы: повторное декодирование одной стороны как utf-8 (создание строки Unicode), в то время как другая сторона остается строкой байтов в кодировке utf-8.