Zum Hauptinhalt springen
Version: 24L

Zeichencodierung

Datenpakete bestehen aus verschiedenen Zahlen und Zeichen. Wie lassen sich diese in Einsen und Nullen übersetzen? Auf dem Computer ist jedem Zeichen eine eindeutige Zahl zugeordnet - eine sog. Zeichencodierung. Eine gängige Zeichencodierung ist etwa ASCII, 128 Zeichen, wobei für ein Zeichen genau 7 bit, also 7 Stellen mit 0 oder 1, notwendig sind. In diesen 128 möglichen Zeichen sind 33 Steuerzeichen und 95 normale Zeichen enthalten.

Steuerzeichen sind spezielle Zeichen wie bspw. das Zeichen \n für einen Zeilenumbruch oder \t für einen Tabulator.

Die ASCII-Codierung enthält noch keine Umlaute, weshalb mit Latin 1, 256 Zeichen der Informationsgehalt um ein Bit erhöht wurde, so dass insgesamt 256 Zeichen codiert werden können - die ersten 128 Zeichen sind dabei identische mit ASCII.

Latin 1 Tabelle

Ausschnitt

ZeichenDezimalBinär
\n1000001010
3200100000
!3300100001
&3800100110
.4600101110
,4400101100
-4500101101
.4600101110
/4700101111
04800110000
14900110001
25000110010
35100110011
45200110100
55300110101
65400110110
75500110111
85600111000
95700111001
:5800111010
=6100111101
?6300111111
@6401000000
A6501000001
B6601000010
C6701000011
ZeichenDezimalBinär
D6801000100
E6901000101
F7001000110
G7101000111
H7201001000
I7301001001
J7401001010
K7501001011
L7601001100
M7701001101
N7801001110
O7901001111
P8001010000
Q8101010001
R8201010010
S8301010011
T8401010100
U8501010101
V8601010110
W8701010111
X8801011000
Y8901011001
Z9001011010
a9701100001
b9801100010
c9901100011
ZeichenDezimalBinär
d10001100100
e10101100101
f10201100110
g10301100111
h10401101000
i10501101001
j10601101010
k10701101011
l10801101100
m10901101101
n11001101110
o11101101111
p11201110000
q11301110001
r11401110010
s11501110011
t11601110100
u11701110101
v11801110110
w11901110111
x12001111000
y12101111001
z12201111010
ä22811100100
ö24611110110
ü25211111100
Latin 1 Tabelle
 

!"#$%&'()*+,-./0
123456789:;<=>?@
ABCDEFGHIJKLMNOP
QRSTUVWXYZ[\]^_`
abcdefghijklmnop
qrstuvwxyz{|}~€
‚ƒ„…†‡ˆ‰Š‹ŒŽ
‘’“”•–—˜™š›œžŸ 
¡¢£¤¥¦§¨©ª«¬­®¯°
±²³´µ·¸¹º»¼½¾¿À
ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐ
ÑÒÓÔÕÖ×ØÙÚÛÜÝÞßà
áâãäåæçèéêëìíîïð
ñòóôõö÷øùúûüýþÿĀ
ZeichenDezimalBinär
000000000
100000001
200000010
300000011
400000100
500000101
600000110
700000111
800001000
\t900001001
\n1000001010
1100001011
1200001100
1300001101
1400001110
1500001111
1600010000
1700010001
1800010010
1900010011
2000010100
2100010101
2200010110
2300010111
2400011000
2500011001
2600011010
2700011011
2800011100
2900011101
3000011110
3100011111
3200100000
!3300100001
"3400100010
#3500100011
$3600100100
%3700100101
&3800100110
'3900100111
(4000101000
)4100101001
*4200101010
+4300101011
,4400101100
-4500101101
.4600101110
/4700101111
04800110000
14900110001
25000110010
35100110011
45200110100
55300110101
65400110110
75500110111
85600111000
95700111001
:5800111010
;5900111011
<6000111100
=6100111101
>6200111110
?6300111111
@6401000000
A6501000001
B6601000010
C6701000011
D6801000100
E6901000101
F7001000110
G7101000111
H7201001000
I7301001001
J7401001010
K7501001011
L7601001100
M7701001101
N7801001110
O7901001111
P8001010000
Q8101010001
R8201010010
S8301010011
T8401010100
U8501010101
ZeichenDezimalBinär
V8601010110
W8701010111
X8801011000
Y8901011001
Z9001011010
[9101011011
\9201011100
]9301011101
^9401011110
_9501011111
`9601100000
a9701100001
b9801100010
c9901100011
d10001100100
e10101100101
f10201100110
g10301100111
h10401101000
i10501101001
j10601101010
k10701101011
l10801101100
m10901101101
n11001101110
o11101101111
p11201110000
q11301110001
r11401110010
s11501110011
t11601110100
u11701110101
v11801110110
w11901110111
x12001111000
y12101111001
z12201111010
{12301111011
|12401111100
}12501111101
~12601111110
12701111111
€12810000000
12910000001
‚13010000010
ƒ13110000011
„13210000100
…13310000101
†13410000110
‡13510000111
ˆ13610001000
‰13710001001
Š13810001010
‹13910001011
Œ14010001100
14110001101
14210001110
14310001111
14410010000
‘14510010001
’14610010010
“14710010011
”14810010100
•14910010101
–15010010110
—15110010111
˜15210011000
™15310011001
š15410011010
›15510011011
œ15610011100
15710011101
15810011110
Ÿ15910011111
16010100000
¡16110100001
¢16210100010
£16310100011
¤16410100100
¥16510100101
¦16610100110
§16710100111
¨16810101000
©16910101001
ª17010101010
ZeichenDezimalBinär
«17110101011
¬17210101100
17310101101
®17410101110
¯17510101111
°17610110000
±17710110001
²17810110010
³17910110011
´18010110100
µ18110110101
18210110110
·18310110111
¸18410111000
¹18510111001
º18610111010
»18710111011
¼18810111100
½18910111101
¾19010111110
¿19110111111
À19211000000
Á19311000001
Â19411000010
Ã19511000011
Ä19611000100
Å19711000101
Æ19811000110
Ç19911000111
È20011001000
É20111001001
Ê20211001010
Ë20311001011
Ì20411001100
Í20511001101
Î20611001110
Ï20711001111
Ð20811010000
Ñ20911010001
Ò21011010010
Ó21111010011
Ô21211010100
Õ21311010101
Ö21411010110
×21511010111
Ø21611011000
Ù21711011001
Ú21811011010
Û21911011011
Ü22011011100
Ý22111011101
Þ22211011110
ß22311011111
à22411100000
á22511100001
â22611100010
ã22711100011
ä22811100100
å22911100101
æ23011100110
ç23111100111
è23211101000
é23311101001
ê23411101010
ë23511101011
ì23611101100
í23711101101
î23811101110
ï23911101111
ð24011110000
ñ24111110001
ò24211110010
ó24311110011
ô24411110100
õ24511110101
ö24611110110
÷24711110111
ø24811111000
ù24911111001
ú25011111010
û25111111011
ü25211111100
ý25311111101
þ25411111110
ÿ25511111111

Text -> Binär

Jedes Zeichen auf der Tastatur hat eine feste Zahl zugeordnet. In Python lässt sich ein Zeichen leicht in die entsprechende Zahl übersetzen:

zeichen = 'g'
zahl = ord(zeichen)
print(zeichen, '->', zahl)

Dargestellt wird eine Zahl im Dezimalsystem, daher mit der Basis 10. Um ins Binäre Zahlensystem mit der Basis 2 zu wechseln, kann die Funktion bin verwendet werden:

bin_zahl = bin(108)
print(bin_zahl)

# Python-Zusatzinformationen über den Datentyp weglassen:
bin_zahl = bin_zahl[2:] # start beim dritten Zeichen
print(bin_zahl)

# auf 1 byte = 8 bit ergänzen
bin_zahl = bin_zahl.zfill(8)
print(bin_zahl)
Aufgabe

Wandeln Sie Ihren Namen in Binär-Code um, indem Sie

  • zuerst jeden buchstaben in eine Zahl umwandeln
  • dann die Zahl ins binäre übersetzen
  • und schliesslich die binäre Zeichenkette mit print ausgeben
bin--name.py
name = 'Reto'
for buchstabe in name:
print(buchstabe)

Binär -> Text

Versuchen Sie nachzuvollziehen, was der folgende Code macht. Erinnerung: int wandelt einen Text in eine Zahl um, chr steht für "Character" und gibt für eine Zahl das entsprechend codierte Zeichen zurück.

code = '01000111'

# in Zahl umwandeln
zahl = int(code)
print('Versuch 1', zahl) # geht nicht, wieso?

zahl = int(code, 2)
print('Versuch 2', zahl)

# in Zeichen umwandeln
print('Zeichen', chr(zahl))
Aufgabe

Wandeln Sie die binäre Folge wieder um in Text. Was kommt dabei raus?

name.py
binaer = ['01000111','01000010','01010011','01001100']
for code in binaer:
print(code)
⭐️ Zusatz 1
Können Sie das übersetzte Wort auch auf einer einzigen Zeile ausgeben?
⭐️ Zusatz 2

Die folgende Funktion wandelt eine Text-Kette aus Binär-Zahlen in eine Liste mit Binär-Zahlen von 8bit länge um. Verwenden Sie diese Funktion, um eine beliebige Zeichenkette in Text umzuwandeln.

def to_8bit(bin_text):
return [bin_text[i:i + 8] for i in range(0, len(bin_text), 8)]

binaer = to_8bit('01000111010000100101001101001100')
print(binaer)
Lösung
binaer = ['01000111','01000010','01010011','01001100']
for code in binaer:
zahl = int(code, 2)
print(chr(zahl))

Binärer Decodierer

Quelle: Twitter

Aufgabe

Der binäre Code befindet sich auf der linken Seite. Wozu braucht es die zweite, rechte Spur?

Unicode / UTF-8 1

Unicode

Unicode ist ein internationaler Standard für Schriftzeichen und Symbole. Das Unicode-Konsortium erstellt einen Katalog von allen sinnvollen Schriftzeichen, welcher ständig erweitert wird. In der Version 12.1, welche im Mai 2019 veröffentlicht wurde, umfasst Unicode 137929137'929 Zeichen.

Hier sind ein paar Zeichen aufgeführt, um zu illustrieren wie umfangreich Unicode ist:

Quelle: UT - Unicode Table

Jedem Unicode-Zeichen hat eine eindeutige Unicode-Nummer, welche häufig als hexadezimale Zahl geschrieben wird.

UTF-8

UTF-8 ist ein Code, der Unicode-Zeichen in Bitmuster übersetzt. Ein Unicode-Zeichen wird mit ein bis vier Byte (daher 8-32 bit) dargestellt. Die folgende Tabelle zeigt, wie die Codierung funktioniert:

Unicode-BereichBitmusterAnzahl Bit
0 bis 1270xxxxxxx7
128 bis 2047110xxxxx 10xxxxxx11
2048 bis 655351110xxxx 10xxxxxx 10xxxxxx16
ab 6553611110xxx 10xxxxxx 10xxxxxx 10xxxxxx21

Unicode-Zeichen mit einer Nummer zwischen 0 und 127 werden mit einem Byte dargestellt, welches mit 0 beginnt. Somit ist UTF-8 in diesem Bereich identisch mit ASCII (und Latin 1).

Für die anderen Zeichen wird mehr als ein Byte verwendet. Dabei beginnt jedes Byte mit einer oder mehreren 1, gefolgt von einer 0. Die Anzahl 1 im ersten Byte definieren, wie viele Bytes für das Zeichen verwendet werden. Die folgenden Bytes werden mit 10 markiert. Die x werden mit der Binärdarstellung der Unicode-Nummer aufgefüllt.

ZeichenNummerBitmuster
A6501000001
ä22811000011 10100100
Schwarze Sonne mit Strahlen ☀972811100010 10011000 10000000
Affe 🐒12801811110000 10011111 10010000 10010010

Der Vorteil dieser Codierung ist, dass am Beginn eines Bytes erkannt wird, ob es sich um den Anfang die Fortsetzung eines Zeichens handelt.

BeginnBedeutung
0…ASCII-Zeichen
10…Fortsetzung eines Zeichens mit mehreren Bytes
110…Beginn eines Zeichens mit zwei Bytes
1110…Beginn eines Zeichens mit drei Bytes
11110…Beginn eines Zeichens mit vier Bytes

Dies wird deutlich, wenn man dies als Binärbaum darstellt:

UTF-8 Präfix
UTF-8 Präfix

Mehrstufige Codierung 2

Oft werden Informationen mehrstufig codiert. So wird beispielsweise die Information «Ich bin müde.» als Emoji dargestellt. Das Handy ordnet dem Emoji die entsprechende Unicode-Nummer zu. Diese wird mit UTF-8 in eine Bitfolge übersetzt, welche über das Mobilfunknetz übermittelt wird.

Das Handy des Empfängers übersetzt die Bitfolge wieder zurück in eine Unicode-Nummer und das entsprechende Emoji. Die Interpretation des Emojis muss vom Empfänger selbst vorgenommen werden.

Unicode zu UTF-8
Unicode zu UTF-8