50. Locales

Menschen haben verschiedene Kulturen – während wir den zweiten Juni 1967 als 2.6.1967 schreiben, würden Briten 2/6/1967 und US-AmerikanerInnen 6/2/1967 schreiben. 10,000 würde hier als 10 gelesen, in den USA aber als 104. Telefonbücher sind je nach Land anders sortiert, die Währungszeichen stehen mal vor, mal hinter dem Betrag usf.

Rechner sollten wissen, wie solche Dinge behandelt werden. Um eine über Plattformen und Programmiersprachen hinweg einheitliche Methode zu haben, an diese Informationen heranzukommen, wurden vor einigen Jahren die Locales definiert.

Pythons Schnittstelle zu den Locales ist im Modul locale. Darin ist u.a. enthalten:

  • setlocale: Setzt das aktuelle Locale
  • strcoll: Vergleichsfunktion für Strings gemäß dem augenblicklichen Locale
  • localeconv(): Gibt ein Dictionary mit allerlei Informationen über das Locale zurück.
  • LC_ALL, LC_CTYPE, LC_COLLATE und etliche mehr: Symbole für setlocale, erlauben Auswahl der „Aspekte” eines Locales.

Beispiel:

>>> import locale
>>> l = ["Ast", "Äste", "ätzend", "Zeder"]
>>> l.sort(locale.strcoll);l
[’Ast’, ’Zeder’, ’\xc4ste’, ’\xe4tzend’]
>>> locale.setlocale(locale.LC_ALL, "de_DE")
’de_DE’
>>> l.sort(locale.strcoll);l
[’Ast’, ’\xc4ste’, ’\xe4tzend’, ’Zeder’]
>>> locale.localeconv()
{’mon_decimal_point’: ’,’, ’int_frac_digits’: 2,
’thousands_sep’: ’.’, ’n_sign_posn’: 1,
’decimal_point’: ’,’, ’n_cs_precedes’: 0,
’negative_sign’: ’-’, ’currency_symbol’: ’DM’}

(Dictionary ist gekürzt)

Wir haben hier alle (LC_ALL) Kategorien auf das gesetzt, was in de_DE definiert ist. de_DE bedeutet dabei „Deutsch, mit den Konventionen in der BRD”, im Gegensatz etwa zu de_CH, „Deutsch mit den Konventionen in der Schweiz”.

Leider kann man sich nie wirklich darauf verlassen, dass ein gegebenes System ein locale wirklich kann, und es ist ohnehin meist das Beste, das Locale, das der/die BenutzerIn selbst ausgewählt hat, zu verwenden. Das System sorgt dafür, wenn man setlocale einen leeren String übergibt.

locale.setlocale(locale.LC_ALL, "")

Die Auswahl des Locales geht unter Unix typischerweise durch Setzen von Umgebungsvariablen (Environment Variables). Dabei handelt es sich um Variablen, die die Shell verwaltet und die Programmen, die von der Shell gestartet werden, weitergegeben werden. Für Locales relevant sind hier LC_ALL oder auch LANG.

Für Bourne-kompatible Shells cann das so aussehen:

examples> cat sorttest.py
import locale

locale.setlocale(locale.LC_ALL, "")
l = ["Ast", "Äste", "ätzend", "Zeder"]
l.sort(locale.strcoll)
print " ".join(l)
examples> export LC_ALL=C
examples> chmod +x sorttest.py
examples> sorttest.py
Ast Zeder Äste ätzend
examples> export LC_ALL=de_DE
examples> sorttest.py
Ast Äste ätzend Zeder

Das locale mit dem Namen „C” ist dabei das Locale, in dem ein Programm, das nichts anderes sagt, läuft.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Macht euch vertraut mit der Art, wie auf eurem System locales gesetzt werden. Probiert ein paar locales durch und beobachtet den Effekt auf locale.localeconv(). Was tut sich bei sorttest.py?


Markus Demleitner

Copyright Notice