Search code examples
pythonunicodecharacter-encodingpython-unicode

Python: make all non-combining unicode characters combining


I have string with accents and diacritics represented by non combining characters:

vyˇcíslitelnost (nerozhodnutelnost, v ˇety o neúplnosti),um ˇelá inteligence (automatické odvozování, rezoluce), univerzální nástroje: SAT a SMT ˇrešiˇce

and I want to turn them into combining characters. For example string above will looks like:

vyčíslitelnost (nerozhodnutelnost, věty o neúplnosti),umělá inteligence (automatické odvozování, rezoluce), univerzální nástroje: SAT a SMT řešiče

How can I achive this ? I already tried unicodedata.normalize but it has no effects on non-combining characters.

Thank you for help


Solution

  • Here's my old-school (anti-pythonic) approach:

    import unicodedata
    
    lettersWithCaron = 'ČčĎďĚ켾ŇňŘřŠšŤťŽžDžǍǎǏǐǑǒǓǔǦǧǨǩǰȞȟ' # from Unicode database
    caron            = '\u02C7'
    
    astring = 'vyˇcíslitelnost (nerozhodnutelnost, v ˇety o neúplnosti),um ˇelá inteligence (automatické odvozování, rezoluce), univerzální nástroje: SAT a SMT ˇrešiˇce'
    for lett in lettersWithCaron:
        astring = astring.replace(
            (caron + unicodedata.normalize( 'NFD',lett)).replace('\u030C',''), lett)
        
    print( astring)
    

    Output shows that there is an additional space before some carons (v ˇety, um ˇelá) in your string (unlike in ˇrešiˇce)…

    .\SO\69647976.py
    

    vyčíslitelnost (nerozhodnutelnost, v ěty o neúplnosti),um ělá inteligence (automatické odvozování, rezoluce), univerzální nástroje: SAT a SMT řešiče