Unterstützt C ++ 0x die Konvertierung von std :: wstring in / aus der UTF-8-Bytefolge?

8

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?

    
Deduplicator 07.03.2009, 10:25
quelle

2 Antworten

15

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   Spezialisierung codecvt <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ür mbstate_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

    
dirkgently 07.03.2009 10:40
quelle
0

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?

    
chmike 09.03.2009 08:00
quelle

Tags und Links