[python-users] 9. Mai

Christopher Arndt chris at chrisarndt.de
Do Mai 10 21:26:10 CEST 2012


Hallo Maria, hallo alle,

Am 09.05.12 15:18, schrieb Maria Orth:
> Kann/mag heute Abend nicht noch wer was über Encodings erzählen? Ich
> krieg gerade die Krise.
> 
> Mein Problem: Ich hab Textdatein, die ich auslese. Hab die im Eclipse
> abgespeichert als utf-8. Wenn ich dann eingelesene Zeilen aber in der
> Windows-Konsole ausgeben will, krieg ich nur Murks. Und das ist nicht
> das erste mal, dass ich wegen blöder Encodings verzweifle. :(

da ich dieses Thema auch gerade den Teilnehmern einer Schulung versucht
habe, einzubläuen, wiederhole auch hier noch mal mein Mantra:

     Eingabe-Daten
    (File, Konsole,
      DB, Web, etc.)
           |
Böse Welt: |
           |
+-----------------------+
| Python:  |            |
|          v            |
|     decode(inp_enc)   |
|          |            |
|          v            |
|        UNICODE        |
|     (sämtliche        |
|  Stringverarbeitung)  |
|          |            |
|          v            |
|     encode(out_enc)   |
|          |            |
+-----------------------+
           |
Böse Welt: |
           v
        Ausgabe
    (File, Konsole,
      DB, Web, etc.)


Die Schwierigkeit ist, den korrekten Wert für "inp_enc" und "out_enc" zu
wissen. Dafür gilt folgendes:

1. Es gibt KEINEN verlässlichen Weg, das Encoding nur anhand der
Input-Daten zu erraten. Man mag mit umfangreichen Heuristiken eine
Erfolgsquote von >90% erreichen, aber es wird immer Grenzfälle geben, wo
es nicht funktioniert. Man muss das Encoding also wissen (oder es aus
irgemdwelchen Einstellungen lesen können).

2. Das richtige Encoding für verschiedene Ausgabearten unterscheidet
sich je nach Betriebsystem, Anwendung, usw. Unter Windows kommt es oft
vor, dass die Konsole ("cmd") ein anderes Encoding verwendet als IDLE,
oder die Python-Konsole, die über das Startmenü aufgerufen wird.

3. *Wenn* man die Wahl hat, sollte man möglichst UTF-8 als Eingabe- und
Ausgabeencoding verwenden, es sei denn dies ist auf Effizenzgründen
nicht gewünscht. (Merke: UTF-8 ist nicht Unicode, sondern ein Encoding,
das Unicodezeichen in Byte-Strings kodieren kann!)

Die zweite Schwierigkeit ist, die Grenze der eigentlichen Applikation zu
definieren, d.h. an welcher Stelle die Dekodierung bzw. Kodierung
stattfinden muss. Python 2.x macht es einem schwer, indem es an vielen
Stellen implizit eine Umwandlung von Unicode nach str oder andersherumn
durchführt und dabei eine Dekodierung oder Kodierung mit einem je nach
Ziel unterschiedlichem Encoding durchfürt. Deswegen sollte man in seinem
Programm nur mit Unicode-Strings arbeiten und die De-/Kodierung mit
selbst definiertem Encoding an definerter Stelle eigenhändig durchführen.


Als Demonstration des Prinzips anbei ein simples Programm, das eine
Textdatei einliest und die darin enthalten, komma-separierten Adressen
auf der Standardausgabe formatiert ausgibt. Dazu eine
Beispieleingabedatei im ISO-8859-1 (aka 'latin1') Encoding.

Versucht mal, was passiert, wenn ihr als zweites Kommandozeilenargument
ein anders Encoding übergebt oder wenn ihr sys.stdout.encoding durch ein
spezifisches Encoding ersetzt. Oder wenn ihr das Programm anstatt in der
Konsole unter IDLE laufen lasst. Am besten unter mehreren Betriebssystemen.


Chris
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : adressbuch.py
Dateityp    : text/x-python-script
Dateigröße  : 973 bytes
Beschreibung: nicht verfügbar
URL         : <http://lists.uni-koeln.de/pipermail/python-users/attachments/20120510/383b4fde/attachment.bin>
-------------- nächster Teil --------------
Meier, Hans, Mühlbachstr. 20 98765 Großstadt
Müller, Jörg, Am Tälchen 10 12345 Kleinstadt 
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 993 bytes
Beschreibung: OpenPGP digital signature
URL         : <http://lists.uni-koeln.de/pipermail/python-users/attachments/20120510/383b4fde/attachment.sig>


Mehr Informationen über die Mailingliste python-users