Die genaue Natur der breiten Zeichen ist (absichtlich) links Implementierung definiert.
Als sie das Konzept wchar_t
erfanden, konkurrierten ISO 10646 und Unicode immer noch miteinander (während sie jetzt meistens kooperieren). Anstatt zu versuchen, zu deklarieren, dass ein internationales Zeichen das eine oder das andere (oder möglicherweise etwas ganz anderes) sein würde, stellten sie einfach einen Typ (und einige Funktionen) zur Verfügung, den die Implementierung definieren könnte, um internationale Zeichensätze zu unterstützen.
Verschiedene Implementierungen haben dieses Potenzial für Variation ausgeübt. Wenn Sie beispielsweise den Compiler von Microsoft unter Windows verwenden, ist wchar_t
ein 16-Bit-Typ, der UTF-16-Unicode enthält (ursprünglich enthielt er UCS-2-Unicode, aber das ist jetzt offiziell veraltet).
Unter Linux ist wchar_t
häufiger ein 32-Bit-Typ, der UCS-4/UTF-32-codierten Unicode enthält. Ports von gcc zu mindestens einigen anderen Betriebssystemen machen das gleiche, obwohl ich nie versucht habe zu bestätigen, dass es immer der Fall ist.
Es gibt jedoch keine Garantie dafür. Zumindest könnte theoretisch eine Implementierung unter Linux 16 Bit verwenden, oder eine unter Windows könnte 32 Bit verwenden, oder jeder könnte sich für die Verwendung von 64 Bit entscheiden (obwohl ich etwas überrascht wäre, dies in der Realität zu sehen).
In jedem Fall ist die allgemeine Idee, wie die Dinge vorgesehen sind zu arbeiten, ist, dass eine einzige wchar_t
ist ausreichend, um einen Codepunkt darzustellen. Für I/O sollen die Daten von der externen Repräsentation (was auch immer es ist) in wchar_t
s umgewandelt werden, was (relativ) sie relativ einfach zu manipulieren macht. Dann werden sie während der Ausgabe wieder in die Kodierung Ihrer Wahl transformiert (die von der Kodierung, die Sie lesen, völlig verschieden sein kann).
Beginnen Sie hier http://www.joelonsoftware.com/articles/Unicode.html –
Der erste Parameter ist tatsächlich vom Typ 'wchar_t []', subtil anders als 'wchar_t *'. – dreamlax