K
berniebutt schrieb:
char text[20]; // ASCII
Eine char-Variable kann zumindest ASCII Codes speichern, da char mindenestens Werte im Bereich 0-127 speichern kann. Ob nun aber ein 'A' wirklich dem Wert 65 (siehe ASCII-Tabelle) entspricht, ist gar nicht festfelegt!
Was Du in einem char speicherst, ist Dir und dem System überlassen. Der Sprache C++ ist das egal, was das genau ist. Der Quelltext besteht aus Zeichen des "basic source character sets" wobei die Kodierung nicht festgelegt ist:
The basic source character set consists of 96 characters: the space character, the control characters representing horizontal tab, vertical tab, form feed, and new-line, plus the following 91 graphical characters:
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
_{}[]#()<>%:;.?*+-/^&|~!=,\"'
Schreibt man im Quelltext beispielsweise 'K' hin, so soll der Compiler dieses Literal durch einen zugehörigen Zahlenwert des sogenannten "excecution character set" ersetzten. Das muss meines Wissens nach nicht ASCII sein und ist eben systemabhängig bzw implementation-defined.
Mit C++11 bekommen wir aber neue character-Typen und auch neue Literale. So ist beispielsweise u'K' ein Literal vom Typ char16_t und der numerische Wert ergibt sich anhand ISO 10646 (UCS, universal character set). Und ein großes U als Präfix, also U'K' ist ein Literal vom Typ char32_t wobei der numerische Wert der entsprechende Unicode ist.
Dementsprechend gibt es auch String-Literale, die mit einem kleinen u oder einem großen U anfangen. Ein Stringliteral, was mit einem kleinen u anfängt, entspricht der UTF-16 Kodierung, weil der Compiler aus einem Zeichen auch ein Surrogate-Paar erzeugen darf. Ich schätze, es sind auch 32-bittige \x-Escapesequenzen zugelassen. Zusätzlich gibt es auch UTF-8-Literale, deren Präfix u8 ist. Allerdings gibt es hier keinen extra Zeichentypen; denn es kommt auch ein normales char-Array heraus, welches eine UTF-8 kodierte Version der Zeichenkette enthält. Komischerweise gibt es kein "UTF-8 Zeichenliteral" (was dann äquivalent zu ASCII sein sollte). Ich schätze mal, dass auf einer sehr komischen Plattform 'A' und u8"A"[0] zwei unterschiedliche Werte haben kann, da 'A' ein Wert eines systemspezifisches "excecution character set" ist und u8"A"[0] den Wert 65 haben müsste, weil das das erste Byte der UTF-8-Kodierung des Strings ist. Aber wenn man die 65 haben möchte, kann man natürlich auch einfach 65 hinschreiben oder static_cast<char>(65).
Ich habe mich nicht allzu intensiv mit Zeichensätzen und Literalen auseinandergesetzt. Vielleicht habe ich auch etwas falsch verstanden oder übersehen. Korrekturen sind willkommen.