UNICODE kann bist zu 65.000 Zeichen darstellen. Auf der Welt exestieren ca. 10000 Schriftzeichen (chinesische u.s.w.) Den Rest kann man für Sonderzeichen- und Steuerzeichen benutzen.
Das ASCII Format hat 7Bit, also 128 mgl. Zeichen. Darin enthalten sind die wichtigsten Steuerzeichen und das lateinische Alphabet (also a...z u.s.w.).
Das ANSI Format hat 8Bit, also 256 mgl. Zeichen. Darin enthalten sind die gleichen Zeichen wie im ASCII und Umlaute, sowie Zeichen mit hochkomma (oder wie das auch immer heisst) (ê u.s.w.). Man merkte das das ASCII - (American Standard Code for Information Interchange) für einige Sprachen wie z.B. Deutsch nicht gut genug war, weil zu klein. Deswegen benutzte man das ANSI ISO Format Langezeit.
Das UNICODE Format wird heutztage schon weltweit genutzt, man schaue sich nur alle Webseiten an, dort ist es total normal das man eine UTF16 Kodierung wählt, also Unicode. Jede Webite und auch jeder Browser kann das darstellen, es ist also nicht so dass wir hier was exotisches machen.
Wir gehen mal davon aus, du bist ein etablierter Programmmierer in einer Firma, diese will Software für den internationalen Markt entwickeln, dann wird diese sicherlich Unicode verwenden und nicht ANSI-ISO.
Das Unicode zwo Bytes braucht, ist logisch weil es auch einen größeren Bereich hat, und wir so alle mgl. Zeichen darstelllen können. Bei unseren heutigen Speicherkapazitäten ist es total wurst, wie viele Bytes wir an einen String verschwenden, besonders da der Rechner meist sowie so nur Adressen braucht und nicht den String an sich (siehe Pointer). Der Rechner braucht also immer einen Wert fester Länger, eine Adresse auf den Stringanfang. Er weiss wo der String zuende ist (bei "0").
Genau DAS machst du auch wenn du sagst wchar_t* hi = L"HI". Der String HI wird irgendwo im Code hinterlegt (meist Datensegment) und die Variable hi erhällt die Adresse (* oder []). DESWEGEN klappt das auch.
Aber es klappt nicht wenn du sowas schreibst: "hi2 == hi" Den du würdest Adressen vergleichen, was totaler nonsense ist, da du ja die Strings vergleichen willst.
wchar_t ist in C++ ein fester Typ. Genauso ist char auch ein Typ. Wenn der Compiler nicht unterscheiden würde, wäre das fatal!
Ein Beispiel:
Char Code: |x| = Ein Byte
Dies entspeicht hallo
|
Quellcode
|
1
|
|h|a|l|l|o|0|
|
Uni Code: |x| = Ein Byte
Dies entspeicht hallo
|
Quellcode
|
1
|
|0|h|0|a|0|l|0|l|0|o|0|0|
|
Wenn ich den Unicode als ANSI Char dekodieren würde:
käme:
0h0a0l0l0o00
Was durchaus nur Murks ist und keein ordentliches Hallo.