1.1
 Enkodierung

1.1.1
 Kodetabellen

Zeichenkodierungen und Zeichensätze 

Einschränkungen von ASCII

Die weitverbreiteste Zeichenkodierung mit 128 Kodes (7-Bit) unterstützt keine nicht-englischen Buchstaben.

Verschiedene Erweiterungen mit 8-Bit Kodierungen

Zeichenkodierungen mit 256 Kodes (1 Byte) für verschiedene Alphabete oder Betriebssysteme: ISO-8859-1, ISO-8859-9, Mac-Roman, Windows-1252

Universale Lösung Unicode

Unicode weist jedem Zeichen einen eindeutigen Zahlen-Kode und eine Kategorie zu. Unicode 6.0 definiert 109’449 graphische Zeichen

Kode-Tabellen von ASCII und ISO-8859-1 (auch latin1) 


pict
Quelle: Nach http://de.wikipedia.org/wiki/ISO_8859-1

Abbildung 1.1.: Zeichenkodetabelle von ISO-Latin-1

Kodierung und Dekodierung von Zeichen in Python 
Zeichenkode berechnen aus Zeichen

>>> ord("A") 
65 
>>> ord(a) 
97
>>> ord(\n) 
10 
>>> ord("\t") 
9
>>> ord(\x20) # Hexadezimal 
32 
>>> ord("\") 
39
Zeichen berechnen aus Zeichenkode

>>> chr(65) 
A 
>>> chr(97) 
a
>>> chr(10) 
\n 
>>> chr(9) 
\t
>>> chr(32) 
  
>>> chr(39) 
""

1.1.2
 Zeichenketten

Datentyp str: Folgen von Zeichen als Bytes 
Datentyp bestimmen und testen

>>> type(A) 
<type str>
>>> type(ab\n) == str 
True
>>> isinstance(ab+chr(10),str) 
True
Achtung: Beispiele immer selber testen!

String-Literale notieren  1

 
# Einzeilige (!) Zeichenkette 
# mit Escape-Sequenzen 
s1 = "a\n\x61"
 
# Rohe Sequenz r"..." 
# ohne Escapes 
s2 = r"a\n\x61"
 
# Longstring 
s3 = """a 
a"""
 
# Rohe Longstring 
s4 = r"""a 
a"""

Datentyp unicode: Folgen von Unicodes 
Unicode Zeichenkodes

>>> ord(u) 
8364
>>> unichr(8364) 
u\u20ac
Datentyp bestimmen und testen

>>> type(uA) 
<type unicode>
>>> type(uab\n) == unicode 
True
>>> isinstance(a,unicode) 
False
String-Literale notieren  2

 
# Einzeilige (!) Zeichenkette 
# mit Escape-Sequenzen 
s1 = u"\u20aca\n\xe4"
 
# Rohe Sequenz ur"..." 
# \uNNNN werden aufgelöst! 
s2 = ur\u20aca\n\xe4
 
# Longstring 
s3 = u"""\u20aca 
ä"""
 
# Roher Longstring 
s4 = ur"""a 
\u00e4"""

1.1.3
 Dateikodierung

Speicher- und Transportformat UTF-8 

Persistente Speicherung und Datenübertragung mit Unicode

UTF (Abk. für Unicode Transformation Format) beschreibt Methoden, einen Unicode-Wert auf eine Folge von Bytes abzubilden. Beispiele für UTF-8-Kodierungen

pict

Quelle: http://de.wikipedia.org/wiki/UTF-8 Gründe für Format mit variabler Länge: Kompatibilität mit ASCII, kompakte Repräsentation, Sortierbarkeit, Erkennbarkeit von Zeichenanfängen

Textdatei als Bytefolgen 
Die Repräsentation der Zeichen mit Kodes > 128 sind unterschiedlich.

Datei in UTF-8-Kodierung

pict


$ hexdump  ae-utf8.txt
0000000 61 c3 a4  0a
0000004

4 Bytes

Datei in Latin-1-Kodierung

pict


$ hexdump  ae-l1.txt
0000000 61 e4  0a
0000003

3 Bytes

Kodierung der Python-Quellkodes deklarieren 

Kodierungskommentar

Deklariere Kodierung immer mit Kodierungskommentar! Datei in UTF-8-Kodierung  3   4

 
#!/usr/bin/python 
# -*- coding: utf-8 -*- 
 
print "Length of a:", len(a), "Canonical:", repr(a) 
print "Length of ä:", len(ä), "Canonical:", repr(ä) 
print "Length of ua:", len(ua), "Canonical:", repr(ua) 
print "Length of uä:", len(uä), "Canonical:", repr(uä)
Achtung: Die Datei muss in der deklarierten Kodierung gespeichert sein!

Das Modul codecs

codecs: Kodieren und Dekodieren

Funktionen für Lesen und Schreiben von Unicode-Strings Einlesen von Latin-1 und schreiben von UTF-8  5

 
import codecs 
 
# Decode from l1 encoded file into unicode strings 
f = codecs.open("./ae-l1.txt", "r", "l1")
 
# Decode from unicode strings into UTF-8 encoded file 
g = codecs.open("./AE-l1-encodeded-as-utf8.txt", "w", "utf-8")
 
for line in f: 
   g.write(line.upper())
Achtung: Beim Einlesen entstehen Zeichenketten vom Typ unicode.