[mailinglist] Re: [Python-de] htmllib und Umlaute

Achim Domma (ProCoders) domma at procoders.net
Sun Apr 27 14:03:07 EDT 2003


Hi Klaus,

> Hm, wenn ich da ein Umlaut eingebe, dann nimmt er das aber ohne
> Probleme an
> und zeigt es mir am Bildschirm in IDLE an. Ich vermute mal, kodiert nach
> Latin-1, weil das der Win-Standard ist?

ich wäre da ziemlich vorsichtig! Ich verwende IDLE nicht, hab' aber mal sehr
schlechte Erfahrungen damit gemacht. In meiner Version (kann sein, daß die
älter war) gab's Probleme, wenn man Nicht-ASCII Zeichen löschen wollte.
Intern werden die wohl als zwei Zeichen (utf-8?) gespeichert, d.h. du mußt
zweimal Backspace drücken. Machst du das nicht und speicherst das File,
schmiert IDLE ab und dein File ist leer!!! Wie gesagt: Es kann sein, daß der
Fehler inzwischen behoben ist, aber für mich war's eine sehr unschöne
Erfahrung.

> a = "abc"	#Das wäre dann 8 Bit. Bis 7 Bit ASCII kodiert,
> alles darüber muss
> 		#durch eine Codepage interpretiert werden

Jein, du hast einen String mit 8bit Werten. Theoretisch kann es auch ein gif
oder sowas sein. Sinn ergeben die Daten erst im richtigen Kontext.

> a = u"abc"	#intern 16 (oder 32?) Bit/Zeichen, vermutlich UTF-16?

Hab' gerade mal in der Doku gesucht, aber keine Default Kodierung gefunden.
Keine Ahnung wie so ein String kodiert ist, aber bei der unicode Funktion,
kannst du ein Encoding angeben.

> > Zeichen diese Bytes bedeuten hängt von der verwendeten Kodierung ab
> > (Latin-1, CP437, ASCII, UTF-8).

Genau, nur mußt du dir klar machen, daß diese Kodierung nicht an dem String
hängt. Angenommen du hast einen Unicodestring mit chinesischen Zeichen:

tmp = u"\xenige\xcodes\xfür\xchinesische\Zeichen"
out = tmp.encode('utf-16')
print out

encode verwandelt tmp in eine 8bit String, mit den utf-16 Werten. Das dieser
String utf-8 kodiert ist, ist ihm jetzt nicht mehr anzusehen, d.h. du mußt
es dir merken. Wenn du jetzt eine Datei mit dem codecs Modul mit utf-8
öffnest und den String dort 'rein schreibst, hast du heilloses Chaos, das
ganz allein in deiner Verantwortung liegt.
Du solltest dir auch klar machen, daß ASCII Strings gleichzeitig gültige
utf-8 Strings sind. Ich hab' schon mehrfach Code für englische Texte
geschrieben und war der Meinung alles wäre richtig. Und beim ersten Umlaut
hat's mich dann erwischt.

> Was bedeutet aber "verwendete Kodierung". So wie es aussieht, verwendet
> Python per Default  ASCII? Kann ich die "verwendete Kodierung" global für
> ein Script umschalten, oder muss man das für jeden String (sobald
> mehr als ASCII) explizit mit encode() machen?
> Gibt es einen Py-Befehl, um mir die default-Kodierung ausgeben zu lassen?

Meines Wissens verwendet die aktuelle Python Version iso-latin-1. Bei 2.3
wird man das Encoding für Sourcefiles angeben können, im Detail angeschaut
hab' ich mir das aber noch nicht.

> > o-umlaut (Latin-1=CP1252, CP437, CP850, UTF-8, MacRoman, ...)
> OK. Gibt es Empfehlungen, welche CP man für Win-Programme und welche für
> Linux-Programme verwenden kann? Meines Wissen verwendet Win Latin-1.

Meiner Meinung nach hängt das davon ab, was du vorhast. Wie Martin schon
geschrieben hat: Wenn du das Problem erstmal richtig verstanden hast, findet
sich auch eine Lösung!

> OK, ich will Latin-1, wie stelle ich das für meinen Script global ein? ;-)

Wie oben beschrieben verwendet Python meines Wissens per default
iso-latin-1. Dein Problem ist eher, daß dein Ausgabemedium (z.B. Console)
etwas anderes erwartet.

Ich hoffe das war hilfreich und ich hab' dich nicht ganz verwirrt! ;-)

Gruß,
Achim





More information about the Python-de mailing list