Сравнение Python UTF-8

a = {"a":"çö"}
b = "çö"
a['a']
>>> '\xc3\xa7\xc3\xb6'

b.decode('utf-8') == a['a']
>>> False

Что идет туда?

отредактируйте =, я сожалею, это была моя ошибка. Это все еще Ложно. Я использую Python 2.6 на Ubuntu 10.04.

18
задан dan04 4 August 2010 в 13:41
поделиться

7 ответов

Возможные решения

Либо напишите так:

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 - интерпретируя их как неравные .

29
ответ дан 30 November 2019 в 07:03
поделиться

b - это string, a - это dict

Вы хотите (я полагаю):

b == a['a']

5
ответ дан 30 November 2019 в 07:03
поделиться

Попробуйте б == а ['а']

2
ответ дан 30 November 2019 в 07:03
поделиться

UTF-8 - это кодировка, используемая для записи текста Unicode в файлы. Однако в Python вы работаете с объектами, которые имеют фиксированный способ представления текста Unicode, и это не UTF-8.

Вы все еще можете сравнивать строки Unicode в Python, но это не связано с UTF-8, за исключением того, что если вы хотите поместить константы в эти строки Unicode, вам нужно будет закодировать текст файла, содержащего ваш исходный код, в UTF-8. Как только оператор присваивания выполняется, строка перестает соответствовать UTF-8, а является внутренним представлением Python.

Кстати, если вы выполняете сравнение с Unicode, вы, вероятно, захотите использовать модуль unicodedata и нормализовать строки перед выполнением сравнения.

3
ответ дан 30 November 2019 в 07:03
поделиться

Вы сравниваете строку с dict.

>>> a = {"a":"çö"}
>>> b = "çö"
>>> a == b
False
>>> a['a'] == b
True

Если вы сравните строку (b) с членом a (a ['a']), то получите желаемый результат.

2
ответ дан 30 November 2019 в 07:03
поделиться

Убедитесь, что ваш код находится в 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).

0
ответ дан 30 November 2019 в 07:03
поделиться

NullUserException правильно, что это должно быть правильно:

b == a['a']

Вы все еще получаете «False», потому что вы: повторное декодирование одной стороны как utf-8 (создание строки Unicode), в то время как другая сторона остается строкой байтов в кодировке utf-8.

0
ответ дан 30 November 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: