Was ist der beste C ++ - Typ zum Speichern von UTF-8-Strings? Ich würde es vermeiden, wenn möglich meine eigene Klasse zu rollen.
Mein ursprünglicher Gedanke war std::string
- allerdings verwendet dies char
als zugrunde liegenden Typ. char
kann unsigniert oder signiert sein - es variiert. Auf meinem System ist es signiert. UTF-8-Code-Einheiten sind jedoch vorzeichenlose Oktette. Dies scheint darauf hinzuweisen, dass es sich um den falschen Typ handelt.
Das führt uns zu std::basic_string<unsigned char>
- das scheint die Rechnung zu erfüllen: unsignierte, 8-Bit (oder größere) Zeichen.
Die meisten Dinge scheinen jedoch char
zu verwenden. glib zum Beispiel verwendet char
. C ++% ostream
verwenden char
.
Gedanken?
Ich würde einfach std :: string verwenden, da es mit dem UTF-8-Ideal von Daten genauso wie mit nullterminierten ASCII-Strings konsistent ist, es sei denn, Sie benötigen ihre Unicode-Eigenschaft.
Ich mag auch GTKmm's Glib :: ustring, aber das funktioniert nur, wenn Sie eine GTKmm (oder zumindest Glibmm) Anwendung schreiben.
Ich habe immer nur std :: string benutzt, mich selbst - irgendwie ist die "signierte" vs "unsignierte" philosophische Frage in einem solchen Kontext (Encoder und Decoder zu / von UTF-8) nie so problematisch Dinge, die du nur selten schreibst, in einem Anwendungskontext verwendest du einfach die std :: string als eine Art "Black Box"! -).
UTF-8 ist eine Zeichencodierung mit variabler Länge . std::basic_string
unterstützt nur Zeichenfolgen mit fester Länge . Wenn Sie Kodierungen mit variabler Länge unterstützen möchten, können Sie die ICU4C-Bibliothek ausprobieren.
ICU ist eine ausgereifte, weit verbreitete Sammlung von C / C ++ - und Java-Bibliotheken, die Unicode- und Globalisierungs-Unterstützung für Software-Anwendungen bieten. ICU ist weitestgehend portabel und bietet auf allen Plattformen und zwischen C / C ++ - und Java-Software die gleichen Ergebnisse.
Wenn Sie nur brauchen, um UTF-8 string zu speichern, würde ich empfehlen, std::vector<char>
zu verwenden. Das wird anzeigen, dass Sie keine tatsächlichen Zeichenfolgenoperationen (die möglicherweise inkorrekt sind) für gespeicherte Daten ausführen können.