In C11 wurde ein neues Zeichenfolgenliteral mit dem Präfix u8 hinzugefügt. Dadurch wird ein Array von Zeichen mit dem in UTF-8 kodierten Text zurückgegeben. Wie ist das überhaupt möglich? Ist das nicht normal? Bedeutet es, dass es wegen des Vorzeichens ein bisschen weniger Informationen zu verwenden hat? Meine Logik würde zeigen, dass eine Zeichenfolge von UTF-8-Text ein Array von unsignierten Zeichen sein müsste.
Ist kein normales Zeichen?
Es ist implementierungsabhängig, ob char
signed
oder unsigned
ist.
Außerdem ist das Vorzeichenbit nicht "verloren", es kann immer noch verwendet werden, um Informationen darzustellen, und char
ist nicht notwendigerweise 8 Bits groß (es könnte auf einigen Plattformen größer sein).
Hier besteht ein potenzielles Problem:
Wenn eine Implementierung mit CHAR_BIT == 8
eine Vorzeichen-Größenrepräsentation für char
verwendet (also char
ist signiert), dann wenn UTF-8 das Bit-Muster 10000000
benötigt eine negative 0. So wenn die Implementierung weiterhin keine negative 0 unterstützt, dann könnte eine gegebene UTF-8-Zeichenfolge einen ungültigen (trap) Wert von char
enthalten, was problematisch ist. Selbst wenn die negative Null unterstützt wird, kann die Tatsache, dass das Bitmuster 10000000
im Vergleich zu char
mit dem Bitmuster 00000000
(der Nullterminator) gleich ist, Probleme verursachen, wenn UTF-8-Daten in char[]
verwendet werden. .
Ich denke, das bedeutet, dass char
für C11-Implementierungen mit Signallebergröße nicht signiert sein muss. Normalerweise hängt es von der Implementierung ab, ob char
signed oder unsigned ist, aber natürlich, wenn char
signed nicht UTF-8-Literale korrekt implementieren kann, muss der Implementierer nur unsigned auswählen. Nebenbei ist dies der Fall für Nicht-2-Komplement-Implementierungen von C ++, da C ++ erlaubt, dass char
sowie unsigned char
verwendet werden, um auf Objektdarstellungen zuzugreifen. C erlaubt nur unsigned char
.
Im Zweierkomplement und dem 1s-Komplement sind die Bitmuster, die für UTF-8-Daten erforderlich sind, gültige Werte von signed char
, sodass die Implementierung char
entweder mit oder ohne Vorzeichen freigibt und trotzdem in der Lage ist, UTF-8 darzustellen. 8 Zeichenfolgen in char[]
. Das liegt daran, dass alle 256-Bit-Muster gültige Zweierkomplementwerte sind und UTF-8 nicht das Byte 11111111
(1s Komplement minus Null) verwendet.
Die Signiertheit von Char ist nicht wichtig; utf8 kann nur mit Verschiebe- und Maskierungsoperationen behandelt werden (was für signierte Typen mühsam sein kann, aber nicht unmöglich ist). Aber: utf8 benötigt mindestens 8 Bits, also "assert (CHAR_BIT & gt; = 8); "
Zur Veranschaulichung nach Punkt: Die folgenden Fragmente enthalten keine arithmetischen Operationen auf den Wert des Charakters, nur shift & amp; mask.
%Vor%