Karakterkódolásra alkalmas kodeknevek összegyűjtése

Ha egy karakterláncot bájtsorozattá kívánunk alakítani, akkor a karakterláncra meg kell hívni az encode() metódust, amelynek argumentuma egy, a kódolásra utaló név, ami az adott kódolást végző kodeket azonosítja.

Az egyes kodekek mint modulfájlok a Python telepítésekor az encodings mappa alá kerülnek. A kodekfájl neve a kódolás szokásos, illetve standard nevével egyezik meg. Még pontosabban, a fájlnév a kódolás nevének úgynevezett normalizált formája, aminek lefőbb jellemzője, hogy a kódolás elnevezésében előforduló nem alfanumerikus karakter (pl. kötőjel vagy mínusz jel) aláhúzásjelként jelenik meg a fájlnévben. Például az ‘iso8859-2’ kódolás kodekfájljának neve iso8859_2.py.

Az egyes kódolásoknak lehetnek alternatív nevei (alias) is, amit ugyanúgy megadhatunk az encode() metódusnak. Ezeket az encodings mappában található aliases.py fájlban az aliases nevű szótár tartalmazza, ahol a szótár kulcsai az alternatív nevek, a kulcsokhoz tartozó értékek pedig a kódolás standard vagy szokásos neve. Például a ‘cp1250’ kódolás alternatív nevei ‘1250’ vagy ‘windows-1250’. Ezért az aliases szótárban az ‘1250’ és ‘windows-1250’ kulcsként szerepel, és mindkettőhöz a ‘cp1250’ érték tartozik.

Most azt a feladatot tűzzük célul ki, hogy gyűjtsük össze a karakterkódolásra alkalmas kodekek standard neveit és a hozzájuk tartozó alternatív neveket. Ez a gyakorláson túl jól jöhet akkor, ha az egyes kódolásokat, azok hatását akarjuk vizsgálni, és nem literál formában akarjuk az encode() metódusnak megadni a kódolások nevét.

A feladat megoldását nehezíti, hogy az encodings mappa alatti kodekek nem mindegyike szolgál karakterkódolásra. Tehát ezeket ki kell szűrni. A másik megoldandó részfeladat az, hogy a karakterkódolásra alkalmas kodeknevek leválogatása után mindegyikhez hozzá kell rendelni az összes alternatív nevet.

A kodeknevek szétválogatását egy erre a célra alkalmas TextEncodingsSelector nevű osztállyal fogjuk végezni, amelynek három különböző példányattribútuma (egy lista, egy halmaz és egy szótár) tartalmazza majd a karakterkódolásra alkalmas kodekneveket, a nem karakterkódolásra szolgáló kodekek neveit, valamint a karakterkódolásra alkalmas kodekneveket a hozzájuk tartozó alternatív nevekkel. Az osztály definíciója a következő. A részletes kommentek segítenek a működési logika megértésében.

A teszteredmények alább láthatók. Itt először a karakterkódolásra alkalmas és nem alkalmas kodekek száma látható. Ezt követően kiírtuk a konkrét kódolások nevei közül néhányat (az összes negyedét) az alternatív nevekkel együtt. Azért nem az összeset, mert amint látható, a karakterkódolásra alkalmas kodekek száma meglehetősen nagy.

A Python hivatalos dokumentációban a codecs modul leírásánál az „Encodings and Unicode” alcím alatt találunk felsorolást a kódolások nevére alternatív nevekkel együtt. Ha a programunk eredményét tüzetesebben összehasonlítjuk a dokumentációban találhatókkal, akkor felfedezhetjük, hogy ott néhány nem szerepel. Pl. nem találjuk a dokumentációban a ‘mac_arabic’, ‘hp_roman8’, ‘mac_croatian’, ‘mac_farsi’, ‘mac_romanian’, és ’tis_620′ nevű karakterkódolásokat. Pedig, ha kipróbáljuk, akkor ezek is érvényesek és működnek. A nevük alapján pedig a neten utánanézhetünk, hogy mik ezek és mire használhatók.

Bár a létrehozott osztály definíciója nem tartalmaz sok kódsort, de a felhasznált nyelvi eszköztár meglehetősen széles. Mindezekről a Python tudásépítés lépésről lépésre című e-könyvben elsősorban a „Beépített konténerobjektumok”, „Műveletek”, „Panelprogram – modulok”, „ Készétel fogyasztás – a szabványos könyvtár moduljainak használata”, valamint a „Mentsük, ami menthető! – fájlok és mappák” fejezetekben lehet részleteiben olvasni.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.