Kristjan Kannike

Unicode’i stringi “ASCIIfitseerimine”

Mida teha, kui tahame failinimesid või URL-e hoida paljas ASCIIs, aga stringides, millest neid genereerida, on täpitähed?

Impordime teegist unicodedata funktsiooni decomposition. See teeb algosadeks lahutatavad tähemärgid kuueteistkümnendkoodideks nagu >>> unicodedata.decomposition(u'õ')
'006F 0303'

(Algosadeks lahutamatu tähemärgi peale nagu u'a' tagastab ta lihtsalt ''.)

Vaatame, mis need on: >>> u'\u006F'
u'o'
on ASCII tähemärk ilma diakriitilise märgita.

Teine võimalus saada koodile vastavat tähemärki on unichr() funktsioon, mida ma ASCIIfitseerivas funktsioonis kasutangi. Näiteks >>> unichr(0x006F)
u'o'

Kuid >>> '\u0303'
u'\u0303'

See on loomulikult tilde, nagu näeme selle nime küsides >>> unicodedata.name(u'\u0303')
'COMBINING TILDE'
või veel parem, ekraanile väljastades:>>> print u'\u0303'
~

Aga ma kaldun kõrvale. Näeme, et otsitav ASCII tähemärk on algosade hulgas esimene.

Järelikult on tähemärgi “ASCIIfitseerimiseks” vaja ta lahutada algosadeks, kui võimalik, string lõhki ajada ja konverteerida ta nullis osa funktsiooniga int() täisarvuks alusel 16.

Loomulikult võiks seda teha keerulisemaks, jättes välja mitteladina tähed nagu π, või konverteerides nad nende ladina tähestiku vasteteks.

Pannes kõik kokku, saame from unicodedata import decomposition

def asciify(string):
'''"ASCIIfy" a Unicode string
by stripping all umlauts, tildes, etc.'''

temp = u''
for char in string:
decomp = decomposition(char)
if decomp: # Not an empty string
temp += unichr(int(decomp.split()[0], 16)) else:
temp += char return temp

Näiteks>>> asciify(u'Järvamaa jõumees Päris Pöörane')
u'Jarvamaa joumees Paris Poorane'