Welche C ++ Zeichenklassen / Systeme existieren, die eine gute Unicode-Unterstützung und eine anständige Schnittstelle haben?

8

Die Verwendung von Strings in der C ++ - Entwicklung ist immer etwas komplizierter als in Sprachen wie Java oder Skriptsprachen. Ich denke, ein Teil der Komplexität kommt von einem Leistungsfokus in C ++, und einige sind nur historisch.

Ich kenne die folgenden Haupt-String-Systeme und möchte herausfinden, ob es andere gibt und welche spezifischen Nachteile sie gegeneinander haben:

Ich gebe zu, dass es keine definitive Antwort geben kann, aber ich denke, dass das SOs-Wahlsystem in einzigartiger Weise dazu geeignet ist, die Präferenzen (und damit die Gültigkeit von Argumenten) von Personen zu zeigen, die tatsächlich ein bestimmtes String-System benutzen.

Aus den Antworten hinzugefügt:

Martin Ba 23.04.2013, 12:01
quelle

3 Antworten

4
  

Verwenden von Zeichenfolgen in C ++ Entwicklung ist   immer etwas komplizierter als in   Sprachen wie Java oder Scripting   Sprachen. Ich denke, einige der   Komplexität kommt von einer Leistung   Fokus in C ++ und einige sind einfach   historisch.

Ich würde sagen, es ist all historisch. Insbesondere zwei Stücke Geschichte:

  • C wurde zu der Zeit entwickelt, als jeder ( sogar Japan ) ein 7-Bit oder 8-Bit benutzte Zeichenkodierung. Aus diesem Grund sind die Konzepte von char und "byte" hoffnungslos verwechselt.
  • C ++ - Programmierer haben schnell erkannt, dass es wünschenswert ist, eine String-Klasse zu haben und nicht nur rohe char* . Leider mussten sie 15 Jahre warten, bis einer offiziell standardisiert wurde. In der Zwischenzeit haben die Leute ihre eigenen String-Klassen geschrieben, an denen wir heute noch festhalten.

Jedenfalls habe ich zwei der von Ihnen erwähnten Klassen verwendet:

MFC CString

MSDN-Dokumentation

Tatsächlich gibt es zwei CString -Klassen: CStringA verwendet char mit "ANSI" -Kodierung und CStringW verwendet wchar_t mit UTF-16-Kodierung. CString ist ein typedef von einem von ihnen abhängig von einem Präprozessor-Makro. ( Viele Dinge in Windows kommen in "ANSI" - und "Unicode" -Versionen.)

Sie könnten UTF-8 für die char -basierte Version verwenden, aber dies hat das Problem, dass Microsoft die Unterstützung von "UTF-8" als ANSI-Codepage verweigert. Daher funktionieren Funktionen wie Trim(const char* pszTargets) , die davon abhängig sind, Zeichengrenzen zu erkennen, nicht korrekt, wenn Sie sie mit Nicht-ASCII-Zeichen verwenden.

Da UTF-16 nativ unterstützt wird, bevorzugen Sie wahrscheinlich die wchar_t -basierte Version.

Beide CString-Klassen haben eine ziemlich praktische Schnittstelle , einschließlich einer printf-ähnlichen Funktion Format . Außerdem können CString-Objekte an diese parags-Funktion übergeben werden, da die Klasse implementiert ist.

Die Hauptnachteile sind:

  • Langsame Performance für sehr große Strings. (Letztendlich habe ich überprüft.)
  • Mangel an Integration mit der C ++ - Standardbibliothek. Keine Iteratoren, nicht einmal << und >> für Streams.
  • Es ist nur Windows.

(Dieser letzte Punkt hat mich viel Frustration verursacht, seit ich für die Portierung unseres Codes auf Linux verantwortlich gemacht wurde. Unsere Firma hat unsere eigene String-Klasse geschrieben, die ein CString, aber plattformübergreifend ist.)

std :: basic_string

Das Gute an basic_string ist, dass es der Standard ist.

Das Schlechte daran ist, dass es keine Unicode-Unterstützung hat. OTOH, es unterstützt Unicode nicht nicht , da es keine Memberfunktionen wie upper() / lower() hat, die von der Zeichencodierung abhängen. In diesem Sinne ist es eher ein "dynamisches Array von Code-Units" als ein "String".

Es gibt Bibliotheken, mit denen Sie std::string mit UTF-8 verwenden können, z. B. das oben erwähnte UTF8-CPP und andere der Funktionen in der Poco Bibliothek.

Informationen zu den zu verwendenden Zeichengrößen finden Sie unter std :: wstring vs std :: string .

    
dan04 23.05.2017, 10:32
quelle
4

Sie sollten UTF8-CPP: UTF-8 mit C ++ in einer tragbaren Weise

sehen

Es ist sehr schlank und hat eine wirklich nette C ++ - Schnittstelle, die den Standard-std :: string als Container für die String-Daten verwendet, wodurch viele Umwandlungen für andere als Unicode-Operationen vermieden werden und einfache zusätzliche Funktionen für die Unicode-Behandlung bereitgestellt werden .

    
Didier Trosset 29.07.2010 08:44
quelle
1

Einige zufällige Gedanken:

  • std::basic_string : Keine Unicode-Unterstützung, nicht wirklich für plattformunabhängige Anwendungen. Wenn Ihr Code für eine bestimmte Plattform bestimmt ist, können Sie normalerweise std::wstring (Windows, UTF-16) oder std::string (Unix-ähnliche Systeme, UTF-8) zum Speichern von Unicode-Strings verwenden, aber alles andere (Codierungen, Zeichen Eigenschaften, Unicode-Algorithmen ...) fehlt vollständig.
  • ICU: Idiosynkratische Schnittstelle, die nicht gut mit STL-Algorithmen (z. B. einem Java-Iterator) harmoniert. Abgesehen davon scheint ICU ein Industriestandard zu sein und ist ziemlich umfangreich. Verwendet hauptsächlich UTF-16, unterstützt aber andere Kodierungen.
  • Qt: Schöne Schnittstelle, die sowohl praktisch als auch STL-kompatibel ist. Verwendet UTF-16 intern. Wäre wahrscheinlich meine erste Wahl, wenn ich plattformunabhängige Anwendungen in C ++ schreiben müsste.
  • GLib, MFC: Das weiß ich nicht.
  • Plattformabhängige Funktionen: Für sehr grundlegende Aufgaben (z. B. Codierungen) können Sie mit diesen auskommen (z. B. iconv auf Unix-ähnlichen Systemen, MultiByteToWideChar unter Windows). Pro: Keine externe Bibliothek erforderlich.
Philipp 29.07.2010 08:45
quelle

Tags und Links