17. Encodings

Computer speichern nur Zahlen, sie wissen zunächst gar nichts von Buchstaben. Um trotzdem Texte verarbeiten zu können, wurden Abbildungen von Zahlen auf Zeichen definiert, so genannte Encodings.

Praktisch alle heutigen Rechner verwenden Abarten von ASCII. Das steht für American Standard Code for Information Interchange, was nur insoweit relevant ist, als “American” drinsteht. Das ist als North American zu verstehen und erklärt, warum die darin erklärten Zeichen nur die sind, die fürs Englische wichtig sind – und warum Umlaute und andere verrückte Zeichen auch heute noch ein Problem für Rechner sind.

ASCII definiert z.B., dass 32 dem Blank entspricht, 33 dem Ausrufezeichen, 65 dem großen A, 97 dem kleinen usf. Insgesamt belegt ASCII die Zahlen zwischen 32 und 127 mit Zeichen. Tatsächlich sind auch die Zahlen zwischen 0 und 31 belegt, und zwar mit so genannten Kontrollzeichen. Darunter befinden sich die Zeilentrenner CR bei 13 und LF bei 10 (CR hat auf Fernschreibern einen “Wagenrücklauf” gemacht, LF ist in die nächste Zeile gegangen), das oben erwähnte Tab bei 9, der Backspace bei 8 und ein Zeichen namens Escape bei 27. Dass ASCII bei 127 aufhört und nicht erst bei 255, wie es für heutige Rechner günstiger wäre, die in einer Speicherzelle 256 verschiedene Werte speichern können, hat historische Gründe.

Jenseits der ASCII-Zeichen gibt es eine Unzahl weiterer Encodings, die von verschiedenen Systemen benutzt wurden und werden:

  • CP1250 (Consumer-Windows)
  • iso-8859-1 (viele Daten aus dem Netz)
  • CP437, CP850 (westeuropäisches DOS)
  • Diverse Darstellungen von ISO10646 bzw. Unicode
  • unglaublich viele weitere

Auch Python speichert “normale” Strings als Sequenz von Zahlen. Die Funktion ord gibt euch die Zahl aus, die einem Zeichen entspricht, die Funktion chr macht aus einer Zahl ein Zeichen:

>>> for c in "(Abakus)": print ord(c),
...
40 65 98 97 107 117 115 41
>>> for i in range(48, 73): print chr(i),
...
0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H

Das geht auch für Nicht-ASCII. Auf meiner Maschine:

>>> ord("Ü")
220
>>> chr(220)
'\xdc'

Die Ausgabe [xdc entsteht, weil Python nicht weiß, welches Encoding das Programm verwendet, das die Zeichen wirklich auf den Bildschirm malt. Deshalb gibt es nur eine ASCII-Darstellung des Zeichens aus. Diese Darstellung ist eingestandenermaßen nicht sehr lesbar, und ich werde erst in Programmieren II erklären, was sie soll. Schickt ihr den entsprechenden String durch print, wird übrigens ein Ü ausgegeben – wenn denn das 220 in euerer augenblicklichen Konfiguration tatsächlich dem Ü entspricht.

Darüber entscheidet meist ein so genannter Terminalemulator. Um das noch komplizierter zu machen, ist bei diesen häufig konfigurierbar, welche Encodings sie verwenden (manchmal auch nur implizit, indem man ihnen entsprechend präparierte Fonts unterschiebt). Unter verschiedenen Windows-Versionen verwendet die grafische Oberfläche ein anderes Encoding als die “Eingabeaufforderung” – kurz: it’s a mess. Insbesondere lohnt es sich nur in Ausnahmefällen, Python zu erzählen, welches Encoding euer Terminalemulator verwendet (was durchaus möglich ist, vgl. Wiki).

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Schreibt ein Programm, das euch eine “ASCII-Tabelle” ausgibt, das also eine Ausgabe wie

32 -> ' '
33 -> '!'
...
produziert. Ihr solltet davon absehen, euch die Zeichen unterhalb 32 ausgeben zu lassen.


Markus Demleitner

Copyright Notice