Best Typ für UTF-8-Daten?

8

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?

    
Thanatos 29.09.2009, 02:48
quelle

3 Antworten

9

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.

    
Michael Ekstrand 29.09.2009, 02:50
quelle
7

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"! -).

    
Alex Martelli 29.09.2009 03:00
quelle
4

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.

    
Kirill V. Lyadvinsky 29.09.2009 03:27
quelle

Tags und Links