Ich sah, dass C ++ 0x Unterstützung für UTF-8, UTF-16 und UTF-32-Literale hinzufügen wird. Aber wie steht es mit den Umwandlungen zwischen den drei Darstellungen?
Ich plane, std :: wstring überall in meinem Code zu verwenden. Aber ich muss auch UTF-8-kodierte Daten manipulieren, wenn ich mit Dateien und Netzwerk arbeite. Wird C ++ 0x auch diese Operationen unterstützen?
In C ++ 0x werden char16_t
und char32_t
verwendet, um UTF-16 und UTF-32 und nicht wchar_t
zu speichern.
Aus dem Entwurf n2798:
22.2.1.4 Klassenvorlage codecvt
2 Die Klasse codecvt wird verwendet, wenn von einem Zeichensatz in einen anderen konvertiert wird, z. B. von breiten Zeichen in Multibyte-Zeichen oder zwischen breiten Zeichencodierungen wie Unicode und EUC.
3 Die in Tabelle 76 (22.1.1.1.1) geforderten Spezialisierungen konvertieren die Implementierung definierter nativer Zeichensatz Codecvt implementiert eine degenerierte Umwandlung; Es konvertiert überhaupt nicht. Die Spezialisierung
codecvt<char16_t, char, mbstate_t>
konvertiert zwischen den UTF-16- und UTF-8-Codierungsschemata, und die Spezialisierungcodecvt <char32_t, char, mbstate_t>
konvertiert zwischen UTF-32 und UTF-8-Codierungsschemata.codecvt<wchar_t,char,mbstate_t>
konvertiert zwischen dem nativen Zeichensätze für schmale und breite Zeichen. Spezialisierungen fürmbstate_t
ausführen Umwandlung zwischen Codierungen, die dem Bibliotheksimplementierer bekannt sind.Andere Codierungen können konvertiert werden, indem auf einen benutzerdefinierten stateT-Typ spezialisiert wird. Das stateT-Objekt kann jeden Zustand enthalten, der für die Kommunikation mit oder von dem spezialisierten do_in oder nützlich ist do_out-Mitglieder.
Das Ding über wchar_t
gibt Ihnen keine Garantie für die verwendete Kodierung. Es ist ein Typ, der einen Multibyte-Charakter enthalten kann. Zeitraum. Wenn Sie jetzt Software schreiben , müssen Sie mit diesem Kompromiss leben. C ++ 0x-kompatible Compiler sind noch weit entfernt. Sie können den VC2010 CTP und g ++ Compilern immer einen Versuch geben, was es wert ist. Außerdem hat wchar_t
verschiedene Größen auf verschiedenen Plattformen, was eine andere Sache ist, auf die man achten sollte (2 Bytes bei VS / Windows, 4 Bytes bei GCC / Mac und so weiter). Es gibt dann Optionen wie -fshort-wchar
für GCC, um das Problem weiter zu komplizieren.
Die beste Lösung ist daher, eine vorhandene Bibliothek zu verwenden. UNICODE-Bugs herumzujagen ist nicht die bestmögliche Verwendung von Aufwand / Zeit. Ich schlage vor, Sie werfen einen Blick auf:
Mehr über C ++ 0x Unicode-String-Literale hier
Danke dir schadenfroh. Ich bin noch nicht registriert, daher kann ich nicht direkt antworten oder als Kommentar antworten.
Ich habe etwas mit Codecvt gelernt. Ich wusste von den Bibliotheken, die Sie vorschlagen, und die folgende Ressource könnte auch nützlich sein Ссылка .
Das Projekt ist für eine Bibliothek gedacht, die Open Source sein sollte. Ich würde es vorziehen, die Abhängigkeiten mit externen Bibliotheken zu minimieren. Ich habe bereits eine Abhängigkeit mit libgc und boost, obwohl ich später nur Threads verwende. Ich würde wirklich lieber am C ++ - Standard festhalten, und ich bin ein wenig enttäuscht, dass die GC-Unterstützung irgendwie verloren gegangen ist.
Offenbar soll VC ++ Express 2008 den Großteil des C ++ 0x-Standards sowie von icc unterstützen. Da ich derzeit mit VC ++ entwickle und es noch einige Zeit dauern wird, bis die Bibliothek veröffentlicht wird, möchte ich versuchen, codecvt und char32_t Zeichenfolgen zu verwenden.
Weiß jemand, wie man das macht? Soll ich eine andere Frage stellen?