Klaus Meyer <km-news1@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 _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de