[Python-de] Byte- und Zeichenfolgen (war: Re: htmllib und Umlaute)

Stefan Schwarzer sschwarzer at sschwarzer.net
Wed Apr 30 01:13:31 EDT 2003


Hallo,

ein paar Gedanken zur Beziehung zwischen Bytes und Zeichen ...

Klaus Meyer wrote:
>> Was sind Encodings?
>> Das Encoding ist eine Vorschrift, wie ich die Zahlen als Bytes 
>> repräsentiere.
> 
> Hier muss es doch sicher Zeichen heißen, und nicht Zahlen?

In diesem Kontext sind mit "Zahlen" wohl die Zahlencodes von Unicode
gemeint. Unicode ordnet jedem in Unicode (genauer: der jeweiligen Unicode-
Version) bekannten Zeichen eine bestimmte Zahl zu.

Meiner Meinung nach ist es am sichersten, Python-Strings einfach nur als
Daten (Byte-Folgen) anzusehen. Leider versteht man unter einem String
traditionell eher eine Folge speziell von Zeichen, nicht einfach von
Bytes.

Strings im Sinne von Bytefolgen hat man z. B. hier:

bild_datei = open('mypic.jpg', 'rb')
bild = bild_datei.read()
bild_datei.close()

bild enthält nun eine Bytefolge, die das Bild repräsentiert; der größte
Teil davon ist aber nicht sinnvoll als lesbares Zeichen zu interpretieren.

Kaum anders ist es hierbei:

text_datei = open('python_tipps.txt')
text = text_datei.read()
text_datei.close()

Bis auf die Umwandlung von Zeilenende-Codes des Betriebssystems in das
Byte 0x0a wird hier auch einfach nur eine Bytefolge gelesen. Der Variablen-
name text gibt zwar einen Hinweis auf die Verwendung dieser Daten, aber
es handelt sich, aus Sicht von Python, dennoch nicht um Zeichen. (Ok,
das ist eine stolze Behauptung, aber ich lasse es mal so stehen ;-) ).

Um zu wissen, welche Zeichen in der Datei stehen (genauer gesagt: welche
Zeichen diese Bytefolge repräsentiert), muss man das Encoding der
Bytefolge kennen. Das Encoding gibt an, wie die Bytefolge in eine
Zeichenfolge umzuwandeln ist bzw. umgekehrt. Diese Umwandlung ist möglich
mit der Funktion unicode:

unicode_text = unicode(text, encoding)   # encoding ist bspw. 'latin1'

In unicode_text steht nun eine Folge von Zeichen. Dafür ist die Bytefolge,
die interne Repräsentation der Zeichen, nicht mehr bekannt (bzw. von der
Python-Implementierung abhängig).

Zusammenfassung: "Normale" Python-Strings sind zunächst einmal nur
Bytefolgen. Ob ein String Zeichen repräsentiert bzw. welche, hängt von der
Interpretation des Strings aus Sicht der Anwendung ab. Andererseits sind
Unicode-Strings Zeichenfolgen und nicht von einer bestimmten Interpre-
tation abhängig.

Stefan





More information about the Python-de mailing list