Преобразование между формами Unicode с декомпозицией и композицией в Python - PullRequest
0 голосов
/ 28 января 2019

Как конвертировать между Cl \ u03e9s и Cl \ u0301s для Clés в python 2.7.10

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Спасибо миллион @MarkRansom за отладку этого со мной, получил то, что я искал сейчас!

    print uni
    >> Clés
    print v1.lower()
    >> cl\u00e9s
    print v2.lower()
    >> cle\u0301s

    print len(unicodedata.normalize('NFD', v1.lower().decode('UTF-8')))
    >> 9
    print len(unicodedata.normalize('NFC', v2.lower().decode('UTF-8')))
    >> 10

    print len(v1.lower().decode("unicode_escape"))
    >> 4

    print len(v2.lower().decode("unicode_escape"))
    >> 5

    print len(unicodedata.normalize('NFD', v1.lower().decode("unicode_escape")))
    >> 5
    print len(unicodedata.normalize('NFC', v2.lower().decode("unicode_escape")))
    >> 4

    print len(v1.lower().decode("unicode_escape"))
    >> 4

    print (v1.lower().decode("unicode_escape") == unicodedata.normalize('NFC', v2.lower().decode("unicode_escape")))
    >> True

Очевидно, что lower () и upper () здесь не будут хорошей идеей для большинства, нодля меня это работает, так как я ожидаю более или менее одно и то же слово от двух разных процессов.

0 голосов
/ 28 января 2019

Функция unicodedata.normalize преобразует строки Unicode в полностью составленные или полностью разложенные формы.

>>> import unicodedata as ud
>>> d = u'Cle\u0301s'
>>> c = u'Cl\u00e9s'
>>> ud.normalize('NFC',c) # no change, already composed form
u'Cl\xe9s'                # Note: escape codes display with a smaller form if possible.
>>> ud.normalize('NFC',d) # changes to composed form
u'Cl\xe9s'
>>> ud.normalize('NFD',c) # changes to decomposed form
u'Cle\u0301s'
>>> ud.normalize('NFD',d) # no change, already decomposed form
u'Cle\u0301s'

Если вы начинаете с байтовых строк в этом формате, следующие строки сначала преобразуются в строки Unicode:

>>> db = 'Cle\u0301s'
>>> cb = 'Cl\u00e9s'
>>> d = db.decode('unicode_escape')
>>> c = cb.decode('unicode_escape')
>>> d
u'Cle\u0301s'
>>> c
u'Cl\xe9s'
...