přihlásit 4415/601776

Locale v Pythonu

V Pythonu nám locale zpřístupňuje modul locale. Tento modul obsahuje řadu funkcí, konstant a datových položek. Některé z nich jsou nedokumentované a jsou závislé na implementaci Pythonu, to jest nevyskytují se všude. Z těch dokumentovaných se to týká funkce nl_langinfo(), která chybí například ve windows, protože tato funkce chybí v implementaci locale samotných windows. Tyto používejte jen při zkoumání Pythonu a locale, nikoli v produkční aplikaci u které nemáte pod kontrolou, kde se spouští. Některé věci jsou v Pythonu implementovány trochu jinak než v jazyku C. V Pythonu není implementována funkce strfmon() pro práci s měnou, místo ní poskytuje funkci currency(). Na formátování čísel nabízí Python funkci format(), která nemá v C obdobu.

Zde popíšu jen ty nejdůležitější funkce, o zbytku si přečtěte originální dokumentaci.

setlocale(category, locale=None)

Funkce setlocale() nastavuje aplikaci její locale.

Parametr category slouží pro zadání kategorie pro kterou locale nastavujeme. Hodnotou je jedna z konstant LC_* které jsou definovány v modulu locale.

Parametr locale je nepovinný a lze nastavit na 3 způsoby. 1) Není-li zadán nebo je none, pak vrací aktuální nastavení locale aplikace. 2) Je-li to prázdný řetězec, pak nastaví aplikaci na defaultní systémové locale. 3) Může být zadán řetězec konkrétního locale.

Řetězec má standardizovaný formát (který Windows nedodržují):

jazyk[_země][.kódování][@modifikátor]

Pozor, zadané locale musí být přítomno v operačním systému, jinak nastavení selže s chybou:
locale.Error: unsupported locale setting.

V linuxu seznam přítomných locale zjistíte příkazem locale -a, ve windows to pravděpodobně není možné uživatelsky zjistit.

jazyk
povinná položka
kód jazyka dle standardu ISO 639
pozor, ve Windows je nutno u češtiny místo 'cs' uvést 'cz'
země
nepovinná ale obvyklá položka
kód země dle ISO 3166
pozor, ve Windows nelze uvést _CZ pro česko
kódování
nepovinná a méně obvyklá položka
identifikátor znakové sady, jako například iso-8859-2 nebo utf-8
pozor, u Windows u češtiny lze uvést jen '1250' místo správného 'cp1250' a nelze to uvést s 'cz'.
modifikátor
nepovinná a vzácně se vyskytující položka
umožňuje definovat několik variant locales pro stejný jazyk, zemi a kódování. Může to být libovolný vysvětlující řetězec.

Správné názvy locale v Linuxu jsou cs_CZ (používá iso-8859-2) a cs_CZ.utf8. Ve Windows je Czech_Czech Republic.1250. K těmto názvům locale existují ještě alternativní, které se přeloží na ty uvedené. Pro Linux i Windows lze použít například czech ve Windows cz.

strcoll(string1, string2)

Lokalizovaná náhrada cmp() pro porovnávání řetězců. Porovná dva řetězce a vrací -1, 0 nebo 1 podle toho, který je větší dle národních zvyklostí. Lze použít například s metodou sort() pro setřídění seznamu podle českých pravidel. Viz. příklad.

format(formát, hodnota, skupiny=0)

Funkce pro formátování čísel. Formát se řídí klasickými % pravidly (viz. formátování řetězců). Hodnota je číslo které chceme formátovat. Nelze formátovat více čísel najednou. Je-li parametr skupiny True, tak je číslo rozděleno na skupiny pomocí oddělovacího znaku. V českém prostředí to je po tisících a oddělovacím znakem je nezlomitelná mezera.

Pozor: Ve Windows 2K je v českém locale chybně uvedena desetinná tečka místo čárky! A dále u všech Windows je nutno dát pozor na to, že v konzoli používají kódování CP852, kdežto locale systém nastavuje pro CP1250 v kterém také probíhá vstup/výstup. Důsledkem je, že oddělovač tisíců – nezlomitelná mezera (v CP1250 znak s kódem 0x0a) – se v konzoli zobrazuje jako znak á (v CP852 znak s kódem 0x0a).

Stejně tak budou vadné lokalizované názvy dnů a měsíců. Je to chyba lokalizace Windows, která nelze systémově řešit a jediné řešení spočívá v ručním překódování. K tomu ale musí programátor vědět v jakém kódování je které locale. To lze naštěstí zjistit funkcí getpreferredencoding().

>>> import locale as l
>>> l.setlocale(l.LC_ALL, "C")
'C'
>>> print l.format("%f", 1234567.1, True)
1234567.100000
>>> l.setlocale(l.LC_ALL, "us")
'English_United States.1252'
>>> print l.format("%f", 1234567.1, True)
1,234,567.100000
>>> l.setlocale(l.LC_ALL, "")
'Czech_Czech Republic.1250'
>>> print l.format("%f", 1234567.1, True)
1á234á567.100000
>>> print l.format("%f", 1234567.1, True).decode("CP1250")
1 234 567.100000
>>> print l.format("%f", 1234567.1, True).decode(l.getpreferredencoding())
1 234 567.100000

Další, méně využívané, funkce jsou popsány v dokumentaci.

Ukázky použítí jsou v příkladech.


Parse error: syntax error, unexpected T_STRING in /web/htdocs2/wraithcz/home/www/python/data/sessions/sessions1.php on line 2