Beim Lesen der ASCII Tabelle wird klar, dass wir heute nicht mehr (ausschließlich) mit diesen Zeichen arbeiten. Es fehlen Zeichen wie Umlaute äöü, oder 😊.
Hier nutzen Computer einen Trick. Für Standardzeichen - also die Zeichen aus der ASCII Tabelle - wird weiterhin ein Byte genutzt und die Ordnung aus der Tabelle eingehalten. Für besondere Zeichen - wie eben die deutschen Umlaute - werden nun zwei Bytes genutzt. Das können wir ganz einfach mit folgendem Programm überprüfen.
char c = 'ü';
printf("%c\n", c);
Beim kompilieren erhalten wir folgende Ausgabe.
mia@surface-mia:~$ gcc test.c
test.c: In function ‘main’:
test.c:4:18: warning: multi-character character constant [-Wmultichar]
4 | char a = 'ü';
| ^~~
test.c:4:18: warning: overflow in conversion from ‘int’ to ‘char’ changes value from ‘50108’ to ‘-68’ [-Woverflow]
Das Zeichen ü
hat einen Wert von 50108, oder 0xc3bc in Hexadezimal. Das hier genutzt System hat den Namen utf-8. Schauen wir also in eine utf-8 Tabelle und suchen nach c3 bc, so sehen wir die Zuordnung zu ü
. Auf diese Weise können wir viele verschiedene Sprachen uns Symbole im gleichen Text einfügen.
char a[5];
a[0] = 0xf0;
a[1] = 0x9f;
a[2] = 0x98;
a[3] = 0x8a;
a[4] = 0;
printf("%s\n", a);
In obigem Code erstellen wir einen gültigen nullterminierten String mit einem 4-byte langen Zeichen. Wir erhalten folgende Ausgabe.
mia@surface-mia:~$ ./a.out
😊
Leider müssen wir trotz dieser Lösung noch aufpassen. Während Linux - also auch WSL - und das Internet den utf-8 Standard nutzen, setzen Windows und MacOS auf utf-16. Die gleichen Bytes produzieren dann anderen Zeichen.
Im letzten Kapitel haben wir den Umgang mit Dateien gelernt. Hierbei werden wir meist mit Strings arbeiten müssen. Die Standardbibliothek bietet im Header string.h
Werkzeuge, um häufige Arbeitsschritte zu erleichtern.