Was ist wchar_t ?
-
Hallo Leute, ich versuche gerade die Unterstützung für Zeichen außerhalb des ASCII-Zeichensatzes zu verstehen. Die Informationen im Internet sind nur teilweise hilfreich, und werden immer neue Fragen auf. Was ich bisher heraus filtern konnte ist, das wchar_t keine vorgegeben Größe hat, sondern groß genug sein muss, um alle Zeichen des Systems aufnehmen zu können. Es können also 8, 16 oder auch 32 bit sein.
Jetzt gibt es auch die Zeichen- und Zeichenkettenliterale (L'c', L"abc"), diese haben wohl auch den typ const wchar_t als basis. Welche Zeichen dürfen denn jezt in diesen Strings vorhanden sein? Welches encoding muss mein Editor verwenden?
Wenn wchar_t ja auch nur 8 Bit groß sein kann, was bringen sie dann überhaupt?Danke.
-
Welche Zeichen vorhanden sein dürfen ist nicht genau spezifiziert. Das hängt alles vom System ab. Aber char kann durchaus für mehr als ASCII genutzt werden. ASCII braucht nur 7Bit und char hat 8Bit. Mit UTF-8 kann man sogar ganz Unicode in char kodieren, wobei dann ein Zeichen aus mehreren char bestehen kann. wchar_t kann alles mögliche sein. Unter Windows ist es in der Regel 16Bit groß und wird für UTF-16 genutzt und unter anderen Betriebssystemen ist es 32Bit groß und wird für UTF-32 genutzt.
Wenn du es dir aussuchen kannst, würde ich eigentlich immer UTF-8 nehmen. UTF-8 hat einfach den Vorteil, dass es ASCII kompatibel ist und für die meisten Zeichen sehr speicherplatzeffizient.
-
ANSI C definiert wchar_t als einen eigenen, in stddef.h definierten integer-Typ.
Dieser Typ muss alle Elemente des sogenannten extended execution character set in allen vorhandenen Locales unterstützen, und dies zeigt schon die enge Abhängigkeit zum hosted environment.
Wenn dein Compilerbauer der Meinung ist, dass das hosted environment keine >8 Bit Zeichen in den Locales unterstützt, braucht er auch nichts hierfür anzubieten, d.h. MB_LEN_MAX == sizeof(char) == 1.
Für die standardgemäß implementierungsabhängige Konstante MB_LEN_MAX kann man sinnvolle Rückschlüsse auf die Größe von wchar_t ziehen.
Mit C95 (wchar.h) kamen dann diverse Funktionen zu wchar_t dazu (wprintf,...), alle aber wieder mit der engen Plattformabhängigkeit.
Deshalb sind auch die wchar_t Literale L'€', L"€" mit gewisser Vorsicht zu benutzen, die Laufzeitumgebung kann sich durchaus anders als deine Entw.umgebung verhalten und entprechende locale-mappings anders oder gar nicht implementieren. (diese Vorsicht gilt natürlich allgemein bei der Verwendung von Zeichen außerhalb von 7-Bit-ASCII in Zeichen- oder Stringliteralen).