Python Unicode równe porównanie nie powiodło się

To pytanie jest związane z szukaniem znaków Unicode w Pythonie

Czytam plik tekstowy unicode używając kodeków python

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

I próbował szukać w nim napisów. Ale dostaję następujące ostrzeżenie.

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

Czy istnieje jakiś specjalny sposób porównywania łańcuchów unicode ?

Author: Community, 2013-08-12

1 answers

Możesz użyć operatora == do porównywania obiektów unicode pod kątem równości.

>>> 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
>>> 

Ale twój komunikat o błędzie wskazuje, że nie porównujesz obiektów unicode. Prawdopodobnie porównujesz obiekt unicode do obiektu str, w ten sposób:

>>> 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

Zobacz, jak próbowałem porównać obiekt unicode z ciągiem znaków, który nie reprezentuje poprawnego kodowania UTF8.

Twój program, jak sądzę, porównuje obiekty unicode z obiektami str, a zawartość str obiekt nie jest poprawnym kodowaniem UTF8. Wydaje się to prawdopodobnie wynikiem tego, że ty (programista) nie wiesz, która zmienna przechowuje unicide, która zmienna przechowuje UTF8, a która przechowuje bajty wczytane z pliku.

Polecam http://nedbatchelder.com/text/unipain.html , szczególnie porady, aby utworzyć " kanapkę Unicode."

 70
Author: Robᵩ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-12 18:57:26