Eine gute Frage! Ich denke DATA ENCODING (manchmal ein CHARSET auch beteiligt) ist ein GEDÄCHTNISAUSDRUCK MECHANISMUS, um Daten in einer Datei zu speichern oder über ein Netzwerk zu übertragen, daher beantworte ich diese Frage wie folgt:
1. Wann sollte ich std::wstring statt std::string verwenden?
Wenn die Programmierplattform oder die API-Funktion eine Einzelbyte-Funktion ist und wir einige Unicode-Daten verarbeiten oder parsen wollen, z. B. aus der Windows'.REG-Datei oder einem 2-Byte-Stream im Netzwerk lesen, sollten wir die Variable std::wstring deklarieren, um sie einfach zu verarbeiten. z.B.: wstring ws=L "a"(6 Oktette Speicher: 0x4E2D 0x56FD 0x0061), wir können ws[0] verwenden, um das Zeichen '' zu erhalten und ws[1], um das Zeichen '' zu erhalten und ws[2], um das Zeichen 'a' zu erhalten, usw.
2. Kann std::string den gesamten ASCII-Zeichensatz enthalten, einschließlich der Sonderzeichen?
Ja. Aber beachten Sie: Amerikanisches ASCII, d.h. jedes 0x00~0xFF-Oktett steht für ein Zeichen, einschließlich druckbarem Text wie "123abc&*_&", und Sie sagten, ein spezielles, das meist als '.' gedruckt wird, um Redakteure oder Terminals nicht zu verwirren. Und einige andere Länder erweitern ihren eigenen "ASCII"-Zeichensatz, z. B. Chinesisch, verwenden 2 Oktette für ein Zeichen.
Wird std::wstring von allen gängigen C++-Compilern unterstützt?
Vielleicht, oder meistens. Ich habe verwendet: VC++6 und GCC 3.3, YES
4. Was genau ist ein "breites Zeichen"?
ein breites Zeichen bedeutet meist, dass 2 oder 4 Oktette verwendet werden, um die Zeichen aller Länder aufzunehmen. 2 Oktett UCS2 ist ein repräsentatives Beispiel, und weiter z.B. Englisch 'a', sein Speicher ist 2 Oktett von 0x0061 (im Gegensatz zu ASCII 'a's Speicher ist 1 Oktett 0x61)
13 Stimmen
Der ASCII-Zeichensatz enthält nicht viele "Sonderzeichen", das exotischste ist wahrscheinlich ` (Anführungszeichen). std::string kann etwa 0,025% aller Unicode-Zeichen aufnehmen (normalerweise 8-Bit-Zeichen)
1 Stimmen
Wenn Sie mit "Sonderzeichen" die Zeichen von 128 bis 255 meinen, die von der verwendeten Norm abhängen, dann werden sie unterstützt.
4 Stimmen
Gute Informationen über breite Schriftzeichen und den zu verwendenden Typ finden Sie hier: programmers.stackexchange.com/questions/102205/
15 Stimmen
Nun, und da wir uns im Jahr 2012 befinden, utf8everywhere.org geschrieben wurde. Es beantwortet so ziemlich alle Fragen über Recht und Unrecht mit C++/Windows.
53 Stimmen
@MSalters: std::string kann 100% aller Unicode-Zeichen enthalten, auch wenn CHAR_BIT 8 ist. Das hängt von der Kodierung von std::string ab, die auf Systemebene (wie fast überall außer Windows) oder auf Anwendungsebene UTF-8 sein kann. Die native enge Kodierung unterstützt kein Unicode? Kein Problem, verwenden Sie sie einfach nicht, sondern verwenden Sie stattdessen UTF-8.
1 Stimmen
Bei WinAPI-basierten Anwendungen ist es sehr ungünstig, std::string zu verwenden, da Sie bei Konvertierungen (UNICODE <-> ANSI), die sehr häufig vorkommen, verlieren. Natürlich können Sie ANSI-Aliase von WinAPI-Funktionen verwenden, aber das sind nur Makros, die Ihre ANSI-kodierten Argumente implizit in UNICODE-Argumente umwandeln und "echten" API-Code aufrufen, der ALLE auf UNICODE basieren (siehe J. Richter "Programming Windows", 5. Auflage).
8 Stimmen
Großartige Lektüre zu diesem Thema: utf8everywhere.org