====== Zeichencodierung ====== Sämtliche Informationen in einem Digitalcomputer werden in Form von Bits, also als Zahlen dargestellt. Der Text, den du gerade liest, besteht aber aus Buchstaben. Damit dies möglich ist, gibt es verschiedene Möglichkeiten Buchstaben und andere Schriftzeichen durch Zahlen darzustellen. Man spricht hier auch von Zeichencodierung. {{ :guide:schei_encoding.png?nolink&600 |}} Da es viele verschiedene Methoden gibt, Text in Zahlen umzuwandeln und wieder zurück, kommt es häufig zu **Codierungsfehlern** wie im Bild dargestellt. Die gespeicherte Zahl wird bei der Umwandlung in Schriftzeichen einfach falsch interpretiert. ===== Empfohlene Lernstrategie ===== ==== ASCII ==== Der einfachste Weg Text in Form von Zahlen abzuspeichern, ist eine Ersetzungstabelle, z. B. nach dem Prinzip A=1, B=2, C=3 usw. Auf ähnliche Weise funktioniert auch der American Standard Code for Information Interchange, kurz ASCII. In der ASCII-Tabelle werden die Zahlen von 0 - 127 (7 Bit) bestimmten Schriftzeichen zugeordnet. Auf der Seite [[https://www.asciitable.com/]] kannst du dir die Tabelle mit der Zuordnung zwischen Zahlen und Schriftzeichen anschauen. Die Zahlenwerte sind dort sowohl dezimal als auch hexadezimal angegeben. Achte vor allem auf den Bereich der Zahlenwerte 32 bis 127. Etwas ausführlicher informiert dich der entsprechende [[https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange|Wikipedia-Artikel]]. Im Alltag eines Informatikers ist es immer wieder hilfreich aus dem Kopf zu wissen, dass * von 0x30 - 0x39 die Ziffern von 0-9 codiert sind * bei 0x41 das große Alphabet beginnt und * bei 0x61 das kleine Alphabet beginnt. ==== ANSI-Zeichencode ==== Wie dir vielleicht aufgefallen ist, kann man mit ASCII keine Umlaute wie ä, ö oder ü codieren. In anderen Sprachen ist das ähnlich. Aus diesem Grund wurde der ASCII-Zeichensatz von einer 7-Bit- auf eine 8-Bit-Darstellung erweitert, so dass 256 statt nur 128 Zeichen codiert werden können. Die Zeichen ab dem Wert 128 werden für verschiedene Sonderzeichen, unter anderem auch Umlaute verwendet. Die gesamte Ersetzungstabelle des ANSI-Codes und einige erläuterungen kannst du dir auf [[https://www.code-knacker.de/ansi.htm|code-knacker.de]] ansehen. ---- {{ :guide:textdatei_hex_ansi.png?direct&800 | Textdatei mit ANSI-Zeichencodierung im Hex-Editor }} Dieser Screenshot zeigt eine einfache Textdatei mit ANSI-Zeichencodierung im Hex-Editor. Hier kann nachvollzogen werden, * wie die hexadezimalen Byte-Werte im linken Abschnitt den jeweiligen Schriftzeichen im rechten Abschnitt entsprechen. * wie Zeilenumbrüche unter Windows codiert werden. * wie der Umlaut **ü** codiert wird. Nimm dir Zeit die Darstellung zu verstehen und die Codierung mit einer Codetabelle nachzuvollziehen. ==== Unicode ==== Da auch der ANSI-Zeichensatz sehr beschränkt ist und ohne eine entsprechende Standardisierung internationale Kompatibilität kaum erreichbar ist, wurde der Unicode-Standard etabliert. In diesem sind nicht nur 256 Zeichen sondern **fast 150.000** Zeichen codiert. Um alle diese Zeichen durchzunummerieren, würden die 8 Bit, mit denen man 256 verschiedene Zeichen darstellen konnte, nicht mehr ausreichen. Stattdessen würde man bis zu 4 Byte benötigen. Dies würde bedeuten, dass ein elektronisch gespeicherter Text **4 mal so viel Platz** brauchen würde, wenn er in Unicode statt im ANSI-Zeichensatz codiert wird. Bei der riesigen Zeichenmenge im Unicode-Standard ist es naheliegend, dass dieser in eine Unterstruktur bestehend aus Ebenen und Blöcken unterteilt wurde. ==== UTF-8 ==== Damit das Platzproblem, das der riesige Unicode-Zeichensatz mit sich bringt im Alltag deutlich weniger Auswirkungen hat, wurde ein Verfahren entwickelt, mit dem sich Unicode-Zeichen auch mit weniger als 18 Bit eindeutig Codieren lassen. Dies wird durch das **Unicode Transformation Format** (UTF) ermöglicht. Am gebräuchlichsten ist die Variante **UTF-8**. Die UTF-8-Codierung ermöglicht es, mit einer variablen Byte-Anzahl (1-4 Bytes) jedes Schriftzeichen im gespeicherten Text eindeutig einem Unicode-Zeichen zuzuordnen. Einen kompakten aber gut nachvollziehbaren Überblick kann dir dieses [[https://www.youtube.com/embed/MijmeoH9LT4|Video über Zeichencodierung von ASCII bis UTF-8]] geben. ---- {{ :guide:textdatei_hex_utf-8.png?direct&800 | Textdatei mit UTF-8-Codierung im Hex-Editor }} Dieser Screenshot zeigt annähernd die selbe Textdatei wie oben, allerdings mit UTF-8-Zeichencodierung. Besonderes Augenmerkt verdient die veränderte Darstellung des Umlautes **ü**. Alle anderen Zeichen benötigen keinen zusätzlichen Speicherplatz. === Versuch === Wenn du dazu auf eigene Faust noch ein wenig Erfahrung sammeln möchtest, dann kannst du in Notepad++ das Hex-Editor-Plugin installieren, selbst eine Textdatei erstellen und beobachten was passiert, wenn du über das Menü die Codierung konvertierst. ==== BCD ==== Die Abkürzung BCD steht für **Binary Coded Decimals**, also für binär codierte Dezimalzahlen. Es gibt verschiedene BCD-Verfahren, aber alle erfüllen den Zweck dezimale Zahlen in binärer Form darzustellen. Eine gebräuchliche Variante davon ist die 8-4-2-1-BCD-Codierung. Die Ziffern stehen in diesem Fall für die Wertigkeiten der 4 Bit, die benötigt werden um mindestens 10 verschiedene Zahlenwerte darzustellen. Bei dieser Codierung wird jeweils ein Nibble (Halbbyte) verwendet um eine dezimale Ziffer zu codieren. In hexadezimaler Darstellung hat eine solche Zahl genauso viele Stellen wie ihre Dezimalzahl. Allerdings geht mit dieser Darstellung auch ein erhöhter Platzbedarf einher, denn die Werte A-F bleiben an jeder Stelle ungenutzt. Nicht zuletzt deshalb wird diese Darstellungsform heutzutage nur noch selten eingesetzt. Unter anderem im Finanzsektor und in der Wissenschaft gibt es einige seltene Anwendungsfälle, in denen diese Darstellung der heute gebräuchlichen vorgezogen wird. Für weitere Details hierzu siehe [[https://de.wikipedia.org/wiki/BCD-Code]]. ==== EBCDIC ==== Der Extended Binary Coded Decimal Interchange Code ist eine Zeichencodierung auf Basis von 8-Bit-Zeichen, welche von IBM entwickelt wurde. Es gibt eine ganze Reihe an EBCDIC-Codepages, welche unterschiedliche Zeichensätze darstellen. Es handelt sich hierbei in erster Linie um eine historische Zeichencodierung, welche aber aufgrund von Rückwärtskompatibilität älterer Anwendungen beispielsweise aus dem Finanzsektor vor allem auf Großrechneranlagen nach wie vor Verwendung findet. EBCDIC ist unter anderem dafür berüchtigt, häufig Kompatibilitätsprobleme zu verursachen. Mehr Informationen zu EBCDIC erhältst du auf [[https://de.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code]]. ===== Zusätzliche und alternative Materialien ===== Wikipedia: [[https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange]] Wikipedia: [[https://de.wikipedia.org/wiki/ANSI-Zeichencode]] Wikipedia: [[https://de.wikipedia.org/wiki/Unicode]] Wikipedia: [[https://de.wikipedia.org/wiki/Unicode_Transformation_Format]] Wikipedia: [[https://de.wikipedia.org/wiki/UTF-8]]