Ist die u8 string-literal notwendig, die in C++11
Vom Wikipedia:
Zum Zweck der Erhöhung der Unterstützung für Unicode in der C++ - Compiler, die definition des Typs char geändert wurde, zumindest die Größe haben, zu speichern acht-bit-Kodierung von UTF-8.
Frage ich mich, was genau dies bedeutet für das schreiben von portablen Anwendungen. Gibt es einen Unterschied zwischen dem schreiben dieses
const char[] str = "Test String";
oder?
const char[] str = u8"Test String";
Gibt es irgendeinen Grund Sie nicht zu verwenden, letzteres für jedes string-literal im code?
Was passiert, wenn nicht-ASCII-Zeichen innerhalb der TestString?
InformationsquelleAutor der Frage Lukas Schmelzeisen | 2012-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Kodierung
"Test String"
ist die Implementierung definierte system-Codierung (das ist die schmale, möglicherweise multibyte).Die Kodierung
u8"Test String"
ist immer UTF-8.Die Beispiele sind nicht sehr aufschlussreich. Wenn Sie einige Unicode-Literale (wie
\U0010FFFF
) in den string ein, dann würden Sie immer bekommen diejenigen, die (als UTF-8 kodiert), aber ob Sie kann sich in das system-codierte Zeichenfolge, und wenn ja, was Ihrer Wert wäre, wird durch die Implementierung festgelegt.Wenn es hilft, Stell dir vor, du bist authoring-Quell-code auf einer EBCDIC-Maschine. Dann das literal "Test-String" ist immer EBCDIC-kodiert in der source-Datei selbst, sondern die
u8
initialisiert array enthält die UTF-8-kodierten Werten, wobei das erste array enthält eine EBCDIC-codierte Werte.InformationsquelleAutor der Antwort Kerrek SB
Die Sie zitieren Wikipedia:
Nun, der "Zweck" ist bullshit.
char
schon immer garantiert werden, der mindestens 8 bit, das heißt, dassCHAR_BIT
schon immer erforderlich ≥8, aufgrund der Bandbreite erforderlich fürchar
im C-standard. Das ist (Zitat C++11 §17.5.1.5/1) "integriert" in die C++ - standard.Wenn ich denke, über die Zweck diese änderung der Formulierung, es wäre nur zu klären, die Dinge für jene Leser, die nichts von der Abhängigkeit vom C-standard.
Hinsichtlich der Wirkung der
u8
wörtliche Präfix, eswirkt sich auf die Kodierung des Strings in der ausführbaren Datei, aber
leider nicht auf den Typ.
So, in beiden Fällen
"tørrfisk"
undu8"tørrfisk"
erhalten Sie einechar const[n]
. Aber in der ehemaligen wörtlich die Kodierung ist unabhängig ausgewählt für den compiler, z.B. mit Latin-1 (oder Windows-ANSI-Western), dass wäre 8 bytes für die Zeichen plus nullbyte, für die array-Größe 9. Während in der zweiten literal der Codierung ist garantiert UTF-8, wo das "ø" wird kodiert mit 2 oder 3 bytes (ich weiß nicht mehr genau), für ein etwas größeres array-Größe.InformationsquelleAutor der Antwort Cheers and hth. - Alf
Der compiler wählt eine systemeigene Codierung ist natürlich die Plattform. Auf typischen POSIX-Systeme wird wahrscheinlich wählen Sie ASCII und etwas, das möglicherweise je nach Umgebung ist die Einstellung für die Charakter-Werte außerhalb des ASCII-Bereichs. Auf mainframes es wird wahrscheinlich wählen, EBCDIC. Vergleichen von strings empfangen, z.B. aus Dateien oder der Befehlszeile wird wahrscheinlich funktionieren am besten mit der nativen Zeichensatz. Bei der Verarbeitung von Dateien explizit kodiert mit UTF-8-Sie sind doch wahrscheinlich am besten aus, mit
u8"..."
strings.Sagte, mit der jüngsten Veränderungen in Bezug auf Zeichenkodierungen eine grundlegende Annahme der string-Verarbeitung in C und C++ kaputt: jeder interne Zeichen-Objekt (
char
,wchar_t
usw.) verwendet, um ein Zeichen darstellen. Dies ist eindeutig nicht mehr wahr, für einen UTF-8 string whee jedes Zeichen-Objekt nur repräsentiert ein byte von einer bestimmten Person. Als Ergebnis werden alle string-manipulation -, Zeichen-Klassifizierung etc. Funktionen nicht unbedingt funktionieren auf diese strings. Wir haben keine gute Bibliothek aufgereiht, um mit einer solchen strings für eine Aufnahme in den standard.InformationsquelleAutor der Antwort Dietmar Kühl
Wenn die execution character set der compiler ist auf UTF-8 eingestellt ist, macht es keinen Unterschied, ob
u8
verwendet wird oder nicht, da der compiler wandelt die Zeichen in UTF-8 in beiden Fällen.Allerdings, wenn der Compiler Ausführung-Zeichensatz des Systems nicht UTF-8-codepage (Standard für z.B. Visual C++), dann non-ASCII-Zeichen möglicherweise nicht korrekt verarbeitet, wenn die
u8
weggelassen wird. Zum Beispiel wird die Konvertierung in wide-strings zum Absturz, z.B. in VS15:InformationsquelleAutor der Antwort Roi Danton