C99 oder früher
Der C-Standard (C99) sieht breite Zeichen und Mehrbyte-Zeichen vor. Da jedoch keine Garantie dafür besteht, was diese breiten Zeichen enthalten können, ist ihr Wert etwas begrenzt. Für eine bestimmte Implementierung bieten sie nützliche Unterstützung. Wenn Ihr Code jedoch zwischen Implementierungen wechseln kann, gibt es keine ausreichende Garantie dafür, dass sie nützlich sind.
Folglich ist der von Hans van Eck vorgeschlagene Ansatz (der darin besteht, einen Wrapper um die ICU - International Components for Unicode - Bibliothek zu schreiben) solide, IMO.
Die UTF-8-Codierung hat viele Vorteile. Wenn Sie nicht mit den Daten herumspielen (z. B. durch Abschneiden), kann sie von Funktionen kopiert werden, die die Feinheiten von UTF-8 nicht vollständig kennen Codierung. Dies ist bei kategorisch nicht der Fall wchar_t
.
Unicode in Full ist ein 21-Bit-Format. Das heißt, Unicode reserviert Codepunkte von U + 0000 bis U + 10FFFF.
Eines der nützlichen Dinge bei den Formaten UTF-8, UTF-16 und UTF-32 (wobei UTF für Unicode-Transformationsformat steht - siehe Unicode ) ist, dass Sie ohne Informationsverlust zwischen den drei Darstellungen konvertieren können. Jeder kann alles darstellen, was der andere darstellen kann. Sowohl UTF-8 als auch UTF-16 sind Multi-Byte-Formate.
UTF-8 ist bekanntermaßen ein Multi-Byte-Format mit einer sorgfältigen Struktur, die es ermöglicht, den Anfang von Zeichen in einer Zeichenfolge zuverlässig zu finden, beginnend an jedem Punkt in der Zeichenfolge. Bei Einzelbyte-Zeichen ist das High-Bit auf Null gesetzt. Bei Mehrbytezeichen beginnt das erste Zeichen mit einem der Bitmuster 110, 1110 oder 11110 (für 2-Byte-, 3-Byte- oder 4-Byte-Zeichen), wobei nachfolgende Bytes immer mit 10 beginnen. Die Fortsetzungszeichen befinden sich immer in der Bereich 0x80 .. 0xBF. Es gibt Regeln, nach denen UTF-8-Zeichen im minimal möglichen Format dargestellt werden müssen. Eine Konsequenz dieser Regeln ist, dass die Bytes 0xC0 und 0xC1 (auch 0xF5..0xFF) nicht in gültigen UTF-8-Daten erscheinen können.
U+0000 .. U+007F 1 byte 0xxx xxxx
U+0080 .. U+07FF 2 bytes 110x xxxx 10xx xxxx
U+0800 .. U+FFFF 3 bytes 1110 xxxx 10xx xxxx 10xx xxxx
U+10000 .. U+10FFFF 4 bytes 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
Ursprünglich hoffte man, dass Unicode ein 16-Bit-Code-Set sein würde und alles in einen 16-Bit-Code-Raum passen würde. Leider ist die reale Welt komplexer und musste auf die aktuelle 21-Bit-Codierung erweitert werden.
UTF-16 ist somit ein Code mit einer Einheit (16-Bit-Wort), der für die 'Basic Multilingual Plane' festgelegt wurde, dh die Zeichen mit den Unicode-Codepunkten U + 0000 .. U + FFFF, verwendet jedoch zwei Einheiten (32 Bit) für Zeichen außerhalb dieses Bereichs. Daher muss Code, der mit der UTF-16-Codierung funktioniert, Codierungen mit variabler Breite verarbeiten können, genau wie UTF-8. Die Codes für die Zeichen mit zwei Einheiten werden als Ersatzzeichen bezeichnet.
Surrogate sind Codepunkte aus zwei speziellen Bereichen von Unicode-Werten, die für die Verwendung als führende und nachfolgende Werte von gepaarten Codeeinheiten in UTF-16 reserviert sind. Führende, auch hoch bezeichnete Surrogate reichen von U + D800 bis U + DBFF, und nachfolgende oder niedrige Surrogate reichen von U + DC00 bis U + DFFF. Sie werden als Ersatzzeichen bezeichnet, da sie keine Zeichen direkt darstellen, sondern nur als Paar.
UTF-32 kann natürlich jeden Unicode-Codepunkt in einer einzelnen Speichereinheit codieren. Es ist effizient für die Berechnung, aber nicht für die Speicherung.
Weitere Informationen finden Sie auf den Websites ICU und Unicode.
C11 und <uchar.h>
Der C11-Standard hat die Regeln geändert, aber nicht alle Implementierungen haben die Änderungen bereits jetzt (Mitte 2017) eingeholt. Der C11-Standard fasst die Änderungen für die Unicode-Unterstützung wie folgt zusammen:
- Unicode-Zeichen und Zeichenfolgen (
<uchar.h>
) (ursprünglich in ISO / IEC TR 19769: 2004 angegeben)
Was folgt, ist ein minimaler Überblick über die Funktionalität. Die Spezifikation enthält:
6.4.3 Universelle Charakternamen
Syntax
Universalzeichenname:
\u
Hex-Quad
\U
Hex-Quad Hex-Quad
Hex-Quad:
Hexadezimal-Ziffer Hexadezimal-Ziffer Hexadezimal-Ziffer Hexadezimal-Ziffer
7.28 Unicode-Dienstprogramme <uchar.h>
Der Header <uchar.h>
deklariert Typen und Funktionen zum Bearbeiten von Unicode-Zeichen.
Die deklarierten Typen sind mbstate_t
(beschrieben in 7.29.1) und size_t
(beschrieben in 7.19);
char16_t
uint_least16_t
Dies ist ein vorzeichenloser Integer-Typ, der für 16-Bit-Zeichen verwendet wird und der gleiche Typ ist wie (beschrieben in 7.20.1.2). und
char32_t
uint_least32_t
Dies ist ein vorzeichenloser Integer-Typ, der für 32-Bit-Zeichen verwendet wird und der gleiche Typ ist wie (auch in 7.20.1.2 beschrieben).
(Übersetzen der Querverweise: <stddef.h>
definiert size_t
,
<wchar.h>
definiert mbstate_t
und <stdint.h>
definiert uint_least16_t
und uint_least32_t
.) Der <uchar.h>
Header definiert auch einen minimalen Satz von (neu startbaren) Konvertierungsfunktionen:
mbrtoc16()
c16rtomb()
mbrtoc32()
c32rtomb()
Es gibt Regeln, nach denen Unicode-Zeichen in Bezeichnern verwendet werden können, die die Notationen \unnnn
oder \U00nnnnnn
verwenden. Möglicherweise müssen Sie die Unterstützung für solche Zeichen in Bezeichnern aktiv aktivieren. Zum Beispiel muss GCC -fextended-identifiers
diese in Bezeichnern zulassen.
Beachten Sie, dass macOS Sierra (10.12.5), um nur eine Plattform zu nennen, keine Unterstützung bietet <uchar.h>
.