Wie man Unicode mit STL Strings und Streams liest / speichert

9

Ich muss mein Programm ändern, um Unicode zu akzeptieren, das aus UTF-8 und den verschiedenen UTF-16- und UTF-32-Kodierungen stammen kann. Ich weiß nicht viel über Unicode (obwohl ich Joel Spolskys Artikel und Wikipedia Seite ).

Im Moment benutze ich std::istream und lese meine Eingabe char by char und speichere (wenn nötig) in std::string . Ich würde gerne

  • Ändern Sie dies (mit so wenig Aufwand), um die obigen Kodierungen zu unterstützen, und
  • finde heraus, wie man die obigen Kodierungen testet (ich bin irgendwie ein Weißbrotamerikaner, und weiß nicht wirklich, wie man eine Beispieltextdatei in einer anderen Kodierung macht), und idealerweise
  • tue dies auf eine plattformübergreifende Weise.

Wenn möglich, möchte ich auch so viel Platz wie möglich sparen (wenn wir also nicht mehr als ein Byte / Zeichen benötigen, benutzen wir es nicht). Soweit ich das verstehe, bedeutet dies, in UTF-8 zu speichern, was in Ordnung ist, aber ich kenne keine Standardzeichenfolge, die das tut (von dem, was ich verstehe, hat wchar_t implementierungsdefinierte Größe und Kodierung). p>     

Jesse Beder 24.12.2008, 07:40
quelle

2 Antworten

2

UTF-8 spart Platz, solange Sie hauptsächlich die Standard-ASCII-Zeichen verwenden.

std :: string hat kein Problem mit UTF-8, da es keine 0 Bytes enthält. Sie können std :: string angeben, wie lange die Zeichen der Eingabe sind, wenn sie wie in UTF-32 NULL-Bytes haben. std :: string würde Ihnen nicht sagen können, wie viele Zeichen Ihre UTF-8-Zeichenfolge hat, Sie müssten eine externe Funktion verwenden.

Außerdem gibt es eine breite Version der std :: string mit wchar_t, im Gegensatz zu char, ich vergesse nur den Namen.

Auch gibt es Facetten für die Umwandlung zwischen Codierungen.

Sie können entweder die Standardbibliothek mit Boost verwenden. Oder Sie können die Funktionen zur Zeichenfolgenverarbeitung aus der C-Bibliothek verwenden. Es gibt auch Funktionen, die von Frameworks wie Qt und Tcl zur Verfügung gestellt werden.

Siehe zum Beispiel:

utf8-Codecvt-Facette

    
Juan 24.12.2008 07:51
quelle

Tags und Links