[Python-de] Tkinter Text-Widget unter Windows Problem beim Speichern

Martin v. Loewis martin at loewis.home.cs.tu-berlin.de
Fri Apr 20 22:52:18 EDT 2001


> 'u'\xe2\xee\xfb\n' lässt sich korrekt speichern, fügt man dem im 
> Text-Widget mit der Tastatur ein ä (umlaut a) hinzu, passiert 
> folgendes (wohlgemerkt, derselbe Text plus einem ä):
> 
> '\xc3\xa2\xc3\xae\xc3\xbb\xe4\n'

Das scheint mir ein Tk-Fehler unter Windows zu sein. Wenn ich unter
Linux (mit Tk 8.3.1)

>>> import Tkinter
>>> t=Tkinter.Text()
>>> t.pack()
>>> t.insert("1.0",u'\xe2\xee\xfb')

ausführe, dann ein ä eingebe, und dann

>>> t.get("1.0","end")

ausführe, bekommen ich

u'\xe2\xee\xfb\xe4\n'

Was passiert bei Dir?

Welche Tk-Version verwendet eigentlich Deine Python-Installation?

Jedenfalls ist das '\xc3\xa2\xc3\xae\xc3\xbb\xe4\n' Unsinn. Der Anfang
ist UTF-8-kodiert:

>>> unicode('\xc3\xa2\xc3\xae\xc3\xbb',"utf-8")
u'\xe2\xee\xfb'

während das letzte Zeichen aus CP-1252 entstammt (ein ä in UTF-8 wäre
\xc3\xa4). Python ruft aber blind die get-Methode vom Tk, stellt fest,
das da Bytes >128 sind, und versucht, das als UTF-8 in Unicode-Objekte
zu konvertieren. Da das kein gültiges UTF-8 ist, ergibt die
Dekodierung einen Fehler, und Python gibt diesen String als Bytestring
zurück.

Wenn Du den nun an einen codec.StreamWriter gibst, ruft der

>>> '\xc3\xa2\xc3\xae\xc3\xbb\xe4\n'.encode("cp1252")
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "/usr/local/lib/python2.2/encodings/cp1252.py", line 18, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeError: ASCII decoding error: ordinal not in range(128)

Das scheitert: Um einen normalen String in CP-1252 zu konvertieren,
muss man ihn erstmal in Unicode umwandeln - und zwar mit Hilfe der
Python-Systemkodierung (ASCII). Dieser String ist aber kein gültiges
ASCII.

Du könntest nun den String in die Datei speichern, so wie er ist, und
bloss Unicode-Objekte kodieren. Damit ist aber nichts gewonnen: In der
Datei steht dann ein Mischmasch von Kodierungen, was sich nicht wieder
vernünftig einlesen läßt.

Deshalb meine Empfehlung: Du hattest erwähnt, dass Du Unicode-Objekte
selber in UTF-8 konvertierst, bevor Du sie an Tk gibst. Diese Praxis
würde ich aufgeben, und immer Unicode-Objekte übergeben.

Falls das nichts hilft, würde ich die neueste Tk-Version
ausprobieren. Falls möglich, solltest Du die Anwendung unter X11
probieren, um zu sehen, ob das ein windows-spezifischer Fehler ist.

Ciao,
Martin




More information about the Python-de mailing list