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

Martin v. Loewis martin at loewis.home.cs.tu-berlin.de
Fri Apr 20 07:53:50 EDT 2001


> ich kaue seit einiger Zeit an folgendem Problem:
> Ich gebe unter Windows 2000 in das Text-Widget von Tkinter Text 
> ein, von dem einige Zeichen im Bereich grösser \x80 (128) liegen, 
> aber \xff (255) nicht überschreiten, also sowas wie das 1/4-Zeichen 
> (188) oder das TM-Zeichen (153). Damit diese Zeichen im Text-
> Widget ordentlich dargestellt werden, codiere ich sie vorher mit 
> folgender Funktion:
> 
> def _u(str):
>     return unicode(str,"cp1252").encode("utf_8")

Das ist nicht erforderlich: man kann in das Textwidget auch direkt
Unicodestrings einfüllen.

> Soweit geht auch alles prima.Das Problem ist nun, den Text des 
> Widgets in ein File abzuspeichern. Im Prinzip ist das klar, aber mit 
> einem einfachen:
> 
> txt = self.textwidget.get(1.0,END)
> f = open(filename,"w")
> f.write(txt)
> 
> erhalte ich meist (bei ausreichender Textmenge: immer) die 
> folgende Fehlermeldung:
> 
> UnicodeError: ASCII decoding error: ordinal not in range(128)

Die get-Methode gibt Unicode-Objekte zurück, falls die Strings nicht
nur ASCII enthalten, also ist txt oft ein Unicode-Objekt.

> f = codecs.open(filename,"w","cp1252")
> f.write(txt)
> macht auch keinen Unterschied; auch wenn ich vorher versuche:

Das ist verwunderlich. "kein Unterschied" bedeutet "ASCII decoding
error"? Kannst Du mal, als Beispiel, das repr() von einem txt senden,
der sich auf diese Weise nicht abspeichern lässt?

Theoretisch kann das passieren, wenn txt ein Byte-String ist, der
Bytes > 128 enthält. In dem Fall würde

def output_encoding(s):
  if type(s) is types.StringType:
    return s
  return s.encode("cp1252")
...
f.write(output_encoding(txt))

helfen. Allerdings sollte das ja nicht nötig sein, da txt nur dann ein
Byte-String ist, wenn alle Zeichen ASCII sind...

Ciao,
Martin



More information about the Python-de mailing list