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:
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:
char
und "byte" hoffnungslos verwechselt. 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:
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:
<<
und >>
für Streams. (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.)
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 .
Sie sollten UTF8-CPP: UTF-8 mit C ++ in einer tragbaren Weise
sehenEs 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 .
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. MultiByteToWideChar
unter Windows). Pro: Keine externe Bibliothek erforderlich. Tags und Links c++