2013-01-21 3 views
6

Mein gegenwärtiger Verständnis des Unterschieds zwischen std::string und std::wstring ist einfach der Typ des Puffers; nämlich char vs wchar_t jeweils.std :: string, wstring, u16/32string klärung

Ich habe auch gelesen, dass die meisten (wenn nicht alle) Linux-Distributionen verwenden char für alle und alle Saiten, sowohl ASCII als auch UTF, auf dem Windows das primäre Betriebssystem ist, das wchar_t mehr verwendet.

Allerdings gibt es ein paar mehr String-Typen, die ich direkt in meinem Kopf erhalten möchte: u16string und u32string, die Strings mit 2-Byte- bzw. 4-Byte-Puffer sind.

So ist meine Frage:

Auf Plattformen mit sizeof(wchar_t) == 2 ist std::wstring funktional äquivalent zu std::u16string sowie Plattformen mit sizeof(wchar_t) == 4 und std::u32string?

+0

Es gibt eine andere ähnliche Frage zu SO über string/wstring [hier

+1

@FloreaMarian Nicht wirklich - diese Frage fragt den Unterschied zwischen 'string 'und' wstring'. Ich frage, ob 'wstring' dasselbe ist wie'u16string' oder' u32string', abhängig von der Größe von 'wchar_t'. – Qix

+1

siehe http://utf8everywhere.org –

Antwort

14

Der Unterschied besteht darin, dass die Details von char und wchar_t sind Implementierung definiert, während die Kodierung von char16_t und char32_t explizit durch den C++ 11-Standard definiert ist.

Das bedeutet, dass wstring ist wahrscheinlich als entweder die gleichen Daten zu speichern u16string oder u32string, aber wir wissen nicht, welche. Und es ist für einige ungerade Implementierung erlaubt, sie alle anders zu machen, da die Größe und Kodierung der alten Char-Typen einfach nicht durch den Standard definiert sind.

+1

'wstring' wird * nie * die gleichen sein wie diese anderen String-Typen. Der Standard * erfordert * 'wchar_t', um ein eindeutiger Typ von' char16_t' und 'char32_t' zu sein. Sie können tatsächlich den gleichen zugrundeliegenden Typ und die gleiche Kodierung haben, aber 'is_same ' wird * niemals * für irgendeine gültige C++ - Implementierung 'wahr' sein. –

+1

"Das gleiche" bedeutet hier "funktional äquivalent", wie es in der Frage heißt. Wenn 'sizeof (wchar_t) == 4 'ist, werden Sie sehr wahrscheinlich dasselbe Ergebnis erhalten, wenn Sie entweder' wstring' oder' u32string' verwenden. –

Verwandte Themen