web-dev-qa-db-fra.com

Python a échoué

Cette question est liée à recherche de caractères Unicode en Python

Je lis un fichier texte Unicode en utilisant python codecs

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

Et essayait de chercher des chaînes dedans. Mais je reçois l'avertissement suivant.

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

Existe-t-il un moyen spécial de comparaison de chaînes unicode?

57
ChamingaD

Vous pouvez utiliser le == opérateur pour comparer les objets unicode pour l’égalité.

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

Mais, votre message d'erreur indique que vous ne comparez pas les objets Unicode. Vous comparez probablement un objet unicode à un objet str, comme ceci:

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

Voyez comment j'ai tenté de comparer un objet unicode à une chaîne qui ne représente pas un codage UTF8 valide.

Je suppose que votre programme compare des objets unicode avec des objets str et que le contenu d'un objet str n'est pas un encodage UTF8 valide. Cela semble provenir du fait que vous (le programmeur) ne sachiez pas quelle variable contient unicide, quelle variable contient UTF8 et quelle variable contient les octets lus dans un fichier.

Je recommande http://nedbatchelder.com/text/unipain.html , en particulier le conseil de créer un "sandwich Unicode".

78
Robᵩ