Подтвердить что ты не робот

Не удалось сопоставить сравнение юникодов Python

Этот вопрос связан с Поиск символов Юникода в Python

Я читаю текстовый файл в формате Юникод, используя кодеки python

codecs.open('story.txt', 'rb', 'utf-8-sig')

И пытался искать строки в нем. Но я получаю следующее предупреждение.

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal

Есть ли какой-либо специальный способ сравнения строк в Юникоде?

4b9b3361

Ответ 1

Вы можете использовать оператор == для сравнения объектов Unicode для равенства.

>>> s1 = u'Hello'
>>> s2 = unicode("Hello")
>>> type(s1), type(s2)
(<type 'unicode'>, <type 'unicode'>)
>>> s1==s2
True
>>> 
>>> s3='Hello'.decode('utf-8')
>>> type(s3)
<type 'unicode'>
>>> s1==s3
True
>>> 

Но ваше сообщение об ошибке указывает, что вы не сравниваете объекты unicode. Вероятно, вы сравниваете объект unicode с объектом str, например:

>>> u'Hello' == 'Hello'
True
>>> u'Hello' == '\x81\x01'
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False

Посмотрите, как я попытался сравнить объект unicode с строкой, которая не представляет допустимую кодировку UTF8.

Ваша программа, я полагаю, сравнивает объекты unicode с объектами str, а содержимое объекта str не является допустимой кодировкой UTF8. Это кажется вероятным результатом того, что вы (программист) не знаете, какая переменная содержит unicide, какая переменная содержит UTF8 и какая переменная содержит байты, считанные из файла.

Я рекомендую http://nedbatchelder.com/text/unipain.html, особенно совет по созданию "Юникод-сэндвич".