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

Martin v. Löwis martin at v.loewis.de
Sun Apr 27 20:54:35 EDT 2003


Klaus Meyer <km-news1 at onlinehome.de> writes:

> 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?

Nein, er kodiert nach ASCII, weil das sys.getdefaultencoding() ist.

Manch einer wird vorschlagen, dieses zu ändern; ich empfehle, diese
Vorschläge zu ignorieren, zumindest bis Du alle Konsequenzen
überschaust.

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

Alles stets durch eine Codepage interpretiert. Es könnte auch EBCDIC
sein, in welchem Fall auch Zeichen <128 nicht ASCII wären.

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

Üblicherweise 16-bit, also 2 Byte pro Zeichen.

> > Zeichen diese Bytes bedeuten hängt von der verwendeten Kodierung ab
> > (Latin-1, CP437, ASCII, UTF-8).
> 
> Was bedeutet aber "verwendete Kodierung". So wie es aussieht,
> verwendet Python per Default  ASCII? 

Hängt vom Kontext ab. In der Regel ist Python die Kodierung völlig
schnuppe, und es ist Sache der Anwendung, die Bytes zu
interpretieren. Gibt man sie beispielsweise auf ein Terminal-Fenster
aus, so interpretiert dieses die Bytes, und sie bekommen dann die
Bedeutung, die sie im Terminal-Fenster haben, usw.

> 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?

Weder noch. Welche Kodierung Bytes haben ist eine Frage der
Interpretation; das ist nicht inherent in den Bytes drin.

Wenn Du beispielsweise in einem Text-Editor Umlaute eingibst, legt der
Text-Editor diese Zeichen auf der Festplatte in einer Bytefolge
ab. Python liest sich diese Bytes durch, und erzeugt eine interne
Repräsentation, die Byte-für-Byte mit der auf der Festplatte identisch
ist.

Wenn es sich also um Python-Quelltext handelt, und der wird in der
"ANSI-Codepage" (cp1252) abgespeichert, weil der Editor notepad.exe
ist, sind die Umlaute zur Laufzeit cp1252-kodiert. Wenn diese Bytes
dann in einem Terminal ausgegeben werden, werden sie als cp850
interpretiert - die gleichen Bytes haben also eine andere
Interpretation, und Python hatte damit gar nichts zu tun - es reicht
die Bytes einfach nur durch.

> Gibt es einen Py-Befehl, um mir die default-Kodierung ausgeben zu
> lassen?

Gibt es, sys.getdefaultencoding(). Die spielt allerdings nur im
Zusammenhang mit Unicode eine Rolle. Sei U ein Unicode-String und B
ein Byte-String, so ist

  U + B

das gleiche wie

  U + unicode(B, sys.getdefaultencoding())

Wenn Python nicht in (oder von) Unicode-Strings konvertieren muss,
bleiben Bytes stets und immer uninterpretiert.

In IDLE findet man allerdings ein anderes Beispiel für
Unicode-Konvertierung: IDLE verwendet intern Unicode, und muss u.U. in
Bytestrings umwandeln - dann wird ebenfalls sys.getdefaultencoding()
verwendet.

> > 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.

So ungefähr, ja. Windows verwendet viele Kodierung - Du redest
vermutlich über die westeuropäischen Windows-Versione (Deutsch,
Französisch, Spanisch, usw). Diese verwenden immer noch zwei
Kodierungen: CP1252 (im Fenstersystem) und CP850 (in der Konsole).
CP1252 ist ungefähr das gleiche wie Latin-1.

> 
> > Klar. Du musst Dich bloss entscheiden, welche Kodierung Du verwenden
> > willst.
> OK, ich will Latin-1, wie stelle ich das für meinen Script global ein? ;-)

Gar nicht. Du musst einfach nur darauf achten, dass alle Strings immer
Latin-1 sind, und akzeptieren, dass Du sie nicht auf der Konsole
ausgeben kannst (weil die cp850 verwenden, wenn Du nicht setcp.exe
aufrufst).

Ciao,
Martin




More information about the Python-de mailing list