Wie kann char [] eine UTF-8-Zeichenfolge darstellen?

8

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.

    
dodehoekspiegel 11.01.2012, 11:42
quelle

4 Antworten

5
  

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).

    
Fred Foo 11.01.2012, 11:44
quelle
6

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.

    
Steve Jessop 11.01.2012 11:56
quelle
1

Nein, ein Vorzeichenbit ist trotzdem ein bisschen! Und die UTF-8-Spezifikation selbst sagt nicht, dass die Zeichen unsigniert sein müssen.

PS Wat ist kookwekker voor 'n naam?

    
Mr Lister 11.01.2012 11:48
quelle
1

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%     
wildplasser 11.01.2012 13:06
quelle

Tags und Links