2013-08-12 17 views
46

Ta kwestia jest związana z Searching for Unicode characters in PythonPython unicode równe porównanie udało

czytam unicode pliku tekstowego przy użyciu kodeków Pythona

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

I starał się wyszukiwać ciągi w nim. Ale otrzymuję następujące ostrzeżenie.

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

Czy istnieje specjalny sposób porównywania ciągów znaków Unicode?

+1

Ten link może być przydatny: http://nedbatchelder.com/text/unipain.html –

+0

Proszę napisać krótki, samodzielny kompletny przykładowy program. Zredukuj swój kod do programu składającego się z pięciu do dziesięciu wierszy, który generuje ten komunikat o błędzie i umieść krótki program w swoim pytaniu. Zobacz http://SSCCE.ORG, aby uzyskać więcej informacji. –

Odpowiedz

64

Możesz użyć operatora ==, aby porównać obiekty unicode dla 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 wiadomość o błędzie wskazuje, że nie sąporównując unicode obiektów. Prawdopodobnie porównanie unicode obiektu do str obiektu, tak jak poniżej:

>>> 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 starałem się porównać obiekt unicode na sznurku, które nie stanowią ważny kodowanie UTF-8.

Twój program, jak przypuszczam, porównuje obiekty unicode z obiektami str, a zawartość obiektu str nie jest prawidłowym kodowaniem UTF8. Wydaje się, że to prawdopodobnie wynik ciebie (programisty) nie wiedzący, która zmienna zawiera unicide, która to zmienna zawiera UTF8 i która to zmienna zawiera bajty odczytane z pliku.

Polecam http://nedbatchelder.com/text/unipain.html, zwłaszcza porady dotyczące tworzenia "Kanapki Unicode".

+2

'u'Hello '==' \ xc3 \ x81'' jest poprawnym UTF-8 i wciąż daje ostrzeżenie. W Pythonie 2 domyślny kodek to 'ascii'. –

+0

Masz rację. –

+0

Otrzymuję to samo ostrzeżenie w moim skrypcie w tej linii: 'hostnames = [] ... jeśli nie (nazwa w nazwach hostów): ...' gdzie 'name' zawiera niektóre ciągi w innej pętli. Czy możesz dodać przykład, jak to naprawić? – rubo77