Unicode-Codierung für String-Literale in C ++ 11
Folgenden eine stellt sich die Frage,würde ich mag zu Fragen, über das neue Zeichen und string-literal-Typen in C++11. Es scheint, dass wir jetzt haben vier Arten von Charakteren und fünf Arten von string-literalen. Die Charakter-Typen:
char a = '\x30'; //character, no semantics
wchar_t b = L'\xFFEF'; //wide character, no semantics
char16_t c = u'\u00F6'; //16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; //32-bit, assumed UCS-4
Und die string-Literale:
char A[] = "Hello\x0A"; //byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; //wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; //(1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; //(2)
auto E[] = u8"\u00F6\U0010FFFF"; //(3)
Dies ist die Frage: Sind die \x
/\u
/\U
Charakter Referenzen frei kombinierbar mit allen string-Typen? Sind alle string-Typen mit fester Breite, d.h. die arrays enthalten, die genau so viele Elemente wie angezeigt in die wörtliche oder zu \x
/\u
/\U
Referenzen erweitert, die in eine variable Anzahl von bytes? Tun u""
und u8""
strings haben die Codierung der Semantik, z.B. kann ich sagen char16_t x[] = u"\U0010FFFF"
und die nicht-BMP-Codepunkt wird kodiert in einer zwei-Einheit UTF16-Sequenz? Und ähnlich für u8
? In (1), kann ich schreiben lone Surrogate mit \u
? Schließlich sind die string-Funktionen Codierung bewusst (D. H. Sie sind Charakter-bewusst und erkennt ungültige byte-Sequenzen)?
Dies ist ein bisschen eine offene Frage, aber ich möchte, um ein möglichst vollständiges Bild wie möglich von der neuen UTF-Codierung und Typ Ausstattung des neuen C++11.
InformationsquelleAutor der Frage Kerrek SB | 2011-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht.
\x
kann verwendet werden, in nichts, aber\u
und\U
nur in Zeichenfolgen verwendet, die speziell UTF-codiert. Jedoch für jede UTF-codierte Zeichenfolge, die\u
und\U
verwendet werden können, wie Sie sehen, passen.Nicht in der Weise, die du meinst.
\x
\u
und\U
konvertiert werden, basierend auf der string-Codierung. Die Anzahl derer, die "code units" (mit Unicode Bedingungen. Einchar16_t
ist ein UTF-16-code-unit) Werte sind abhängig von der Kodierung der mit Zeichenfolge. Die wörtlicheu8"\u1024"
schaffen würde, einen string mit 2char
s plus ein null-terminator. Die wörtlicheu"\u1024"
würde erstellen Sie eine Zeichenfolge mit 1char16_t
plus ein null-terminator.Die Anzahl der code-Einheiten verwendet wird, basiert auf der Unicode-Codierung.
u""
schafft eine UTF-16-codierte Zeichenfolge.u8""
schafft eine UTF-8-codierte Zeichenfolge. Sie kodiert werden gemäß der Unicode-Spezifikation.Absolut nicht. Die Spezifikation verbietet ausdrücklich die Verwendung der UTF-16-Ersatzzeichen Paare (0xD800-0xDFFF) als codepoints für
\u
oder\U
.Absolut nicht. Nun, lassen Sie mich das anders formulieren.
std::basic_string
sich nicht mit Unicode-Kodierungen. Sie können gewiss store UTF-kodierte strings. Aber Sie können nur von Ihnen denken, als Sequenzen vonchar
char16_t
oderchar32_t
; Sie kann nicht von Ihnen denken, als eine Sequenz von Unicode-codepoints, die codiert sind mit einem besonderen Mechanismus.basic_string::length()
zurück, die Anzahl der code-Einheiten, nicht-code Punkte. Und offensichtlich ist der C-standard-Bibliothek von string-Funktionen sind völlig nutzlosEs sollte jedoch angemerkt werden, dass die "Länge" für ein Unicode-string bedeutet nicht, dass die Anzahl der codepoints. Einige code-Punkte sind die Kombination von "Zeichen" (ein unglücklicher name), die zusammen mit der vorherigen codepoint. Also mehrere codepoints können eine Zuordnung zu einem einzigen visuellen Charakter.
Iostreams kann in der Tat Lesen/schreiben Unicode-kodierte Werte. Dies zu tun, müssen Sie verwenden ein Gebietsschema angeben der Codierung und richtig durchtränken es in den verschiedenen Orten. Das ist leichter gesagt als getan, und ich habe keinen code auf, mir zu zeigen, wie Sie.
InformationsquelleAutor der Antwort Nicol Bolas