La chaîne supérieure est tapée par moi tandis que la chaîne inférieure est extraite d'une base de données.

bytes('TOYOTA', 'utf-8')
>> b'TOYOTA'

bytes('ΤΟΥΟΤΑ', 'utf-8')
>> b'\xce\xa4\xce\x9f\xce\xa5\xce\x9f\xce\xa4\xce\x91'

Cela provoque des résultats indésirables lorsque je veux vérifier son existence

'TOYOTA' == 'ΤΟΥΟΤΑ'
>> False

Une idée comment "réparer" la chaîne incorrecte?

1
Zhi Qin Tan 28 août 2020 à 17:25

2 réponses

Meilleure réponse

Il semble que ce soient des lettres majuscules grecques:

>>> import unicodedata
>>> s = 'ΤΟΥΟΤΑ'
>>> for c in s:
...     print(unicodedata.name(c))
... 
GREEK CAPITAL LETTER TAU
GREEK CAPITAL LETTER OMICRON
GREEK CAPITAL LETTER UPSILON
GREEK CAPITAL LETTER OMICRON
GREEK CAPITAL LETTER TAU
GREEK CAPITAL LETTER ALPHA

Vous pouvez essayer d'utiliser l'une des bibliothèques tierces disponibles pour effectuer une translittération vers l'alphabet latin, par exemple:

C'est une question similaire: Comment puis-je créer une chaîne en lettres anglaises à partir d'un autre mot de langue?

2
mkrieger1 28 août 2020 à 15:01

Pour résoudre ce problème, j'enregistrerais l'octet généré à partir de la chaîne extraite de la base de données dans une variable, puis je remplacerais l'octet souhaité:

>>> toyota_database_fix = b'\xce\xa4\xce\x9f\xce\xa5\xce\x9f\xce\xa4\xce\x91'
>>> toyota_database_fix = b'TOYOTA'

Maintenant décodé et enregistrez-le:

>>> toyota_database_fix = toyota_database_fix.decode('UTF-8')
>>> # now toyota_database_fix.decode('UTF-8') = 'TOYOTA'

Si vous souhaitez vérifier son existence:

>>> 'TOYOTA' == toyota_database_fix
True
-2
Kayaba_Attribution 28 août 2020 à 15:32