UTF-8
ist eine mögliche Kodierung für Unicode. Es definiert 1, 2, 3 oder 4 Bytes pro Zeichen. Wenn Sie es durch getwc()
lesen, wird es ein bis vier Bytes abrufen und daraus ein einzelnes Unicode-Zeichen Codepunkt, die in eine wchar
passen würde (die 16 oder sogar 32 Bit breit sein können, je nach Plattform).
Da Unicode-Werte jedoch allen Werten von 0x0000
bis 0xFFFF
zugeordnet sind, sind keine Werte für die Rückgabe von Bedingungen oder Fehlern vorhanden. (Einige haben darauf hingewiesen, dass Unicode größer als 16 Bits ist die Fälle surrogate pairs verwendet. Aber der Punkt ist, dass Unicode verwendet alle der verfügbaren Werte verlassen keine für EOF.)
diverse Fehlercodes umfassen EOF (WEOF
), die auf -1 abbildet. Wenn Sie den Rückgabewert getwc()
in eine wchar
setzen würden, gäbe es keine Möglichkeit, sie von einem Unicode 0xFFFF
Zeichen zu unterscheiden (das, BTW, ist sowieso reserviert, aber ich schweife ab).
So ist die Antwort einen breiteren Typen verwenden, ein wint_t
(oder int
), die mindestens 32 Bits enthält. Das gibt die unteren 16 Bits für den realen Wert, und alles mit einem außerhalb dieses Bereichs gesetzten Bit bedeutet, dass etwas anderes als ein zurückkehrendes Zeichen passiert ist.
Warum verwenden wir nicht immer wchar
dann statt wint
? Die meisten string-bezogenen Funktionen verwenden wchar
, da sie auf den meisten Plattformen die halbe Größe von wint
haben, so dass Strings einen kleineren Speicherbedarf haben.
Ein UTF-8-Zeichen kann 4 Byte lang sein, technische es sogar 5 oder 6 Bytes nehmen, aber solche Zusammensetzungen sind nicht gültig UTF-8-Zeichen. – quinmars
Nun, wahr. Es kann 4 Byte lang sein, wenn Sie die zusätzlichen Plan Zeichen von 0x10000 gehen und höher, aber das wird in Surrogate, wenn sie mit UTF-16 zu tun, und ich dachte, es nicht in den Anwendungsbereich der Frage. Und während 5 oder 6 Byte-Sequenzen möglich sind, können sie immer in weniger als 5 Bytes ausgedrückt werden und werden nur von Serializern schlechter Qualität erzeugt. – lavinio
Ihre Antwort ist größtenteils korrekt, aber Sie liefern zu viele (platofrm depentent) Details. 'wchar_t' ist _nicht_ immer 16 Bits, ich kann mir mindestens 2 OS/Compiler-Kombinationen vorstellen, wo es 32 ist. –