[Python-de] pyGtk und Umlaute in win32

Martin v. Loewis martin at loewis.home.cs.tu-berlin.de
Fri Mar 2 22:43:43 EST 2001


Hallo Janos,

> 1) die Beispiele funktionieren (zumindest auf meinem System bzw. 
> meiner pyGTK-Installation nicht, solange man "from GTK import *" 
> nicht auf "from gtk import *" ändert. 

Mit der PyGTK-Version auf der Buch-CD sollte es eigentlich
funktionieren. GTK stellt lediglich die Konstanten bereit
(JUSTIFY_LEFT usw).

> Vielleicht hab ich eine seltsame Version des pygtk-Moduls, aber es
> schadet nicht.

gtk.py enthält "from GTK import *", deshalb funktioniert das natürlich
auch.

> 2) Umlaute und nicht-ascii-Sonderzeichen werden in pyGtk unter win32 
> nicht angezeigt. Abhilfe schafft die vorherige Kodierung in unicode, 
> was aber wieder (nur?) unter python 2 geht; ich weiß nicht, obs in 
> pyGTK schon eine Funktion dafür gibt.

Unter Linux, mit PyGTK 0.6.6 (und GTK 1.2), funktioniert es einfach so
- keine Ahnung, warum GTK unter Windows UTF-8 erwartet; unter X11 wird
jedenfalls der String so, wie er ist, vom X-Server interpretiert
(unter Beachtung des gewählten Fonts). Es scheint, als ob GTK 2 das
vereinheitlichen wird - mehr dazu vermutlich auf der GTK-Liste
(gtk-i18n-list at redhat.com).

Wer eine portable Latin-1-nach-UTF-8-Bibliothek benötigt, findet sie
in PyXML.  Die ist natürlich deutlich langsamer als
unicode(...).encode(...).

> openitem=gtk.GtkMenuItem(unicode("Öffnen",
> 	 "latin-1").encode("utf8")) 	# "latin-1" hängt wohl vom 	
>                                       # Zeichensatz der Plattform ab

Wenn, dann vom Zeichensatz der Plattform, auf der der Quelltext
geschrieben wurde (siehe auch das Beispiel auf S. 226/227),
langfristig wird GTK (und dann PyGTK) hoffentlich Unicode direkt
unterstützen, wonach dann

openitem=gtk.GtkMenuItem(unicode("Öffnen","latin-1"))

die richtige Lösung ist (gegenwärtig versucht pygtk, das nach ASCII
zurückzuwandeln, und das scheitert).

Zur Internationalisierung ist vielleicht sowieso

openitem=gtk.GtkMenuItem(_("Open"))

die beste Lösung, wobei dann die Übersetzung in einem separaten
Messagekatalog erfolgt. Wer trotzdem noch Umlaute im Quelltext
benötigt und sie in Unicode-Strings benutzen will, kann vielleicht
irgendwann mal

directive encoding "Latin-1"

am Modulanfang schreiben und braucht dann nur noch 

openitem=gtk.GtkMenuItem(u"Öffnen")

zu schreiben.

> Man könnte die Konvertierung auch in eine Funktion verschieben, die 
> abhängig von der Python-Version Konvertierungen nach unicode oder zu 
> "oe, ue" etc. vornimmt.

Das würde ich empfehlen, etwa

if sys.platform=="win32":
  try:
    unicode("") # wirft Ausnahme in Python 1.5
    def _(msg):
      return unicode(msg,"latin-1").encode("utf-8")
  except ImportError:
    trans = {"Ö":"Oe" ... }
    import string
    def _(msg):
      res = []
      for c in msg: res.append(trans.get(c,c))
      return string.join(c,"")
else:
  def _(msg):
    return msg

Danach kann man dann

openitem=gtk.GtkMenuItem(_("Öffnen"))

schreiben...

Ciao,
Martin



More information about the Python-de mailing list