Universal characters escapen
-
Hi, ich rätsel gerade wie man "universal" characters richtig schreibt/escaped.
Ich habe mal ein wenig bei Microsoft in der Char Klasse von C# geschaut. Klar das ist kein C++ aber dort werden character im ascii Zahlenbereich mit \x eingeleitet. Surrogate characters aber dagegen mit \u. Vielleicht ist Microsoft, da aber auch nur selber inkonsequent. Da ich char32_t verwende hätte ich jetzt getippt, dass ich mit \U escapen muss. Evtl. ist auch das erste U vom _T Macro U'\U...' doppelt gemoppelt? Aber so '\U...' geht es halt auch nicht. Scheinbar funktioniert nur \x, aber ist das dann auch richtig?#define _T(x) U##x // Geht, aber richtig so? char32_t cHighSurrogateStart1 = _T('\xD800'); char32_t cHighSurrogateEnd1 = _T('\xDBFF'); char32_t cLowSurrogateStart1 = _T('\xDC00'); char32_t cLowSurrogateEnd1 = _T('\xDFFF'); char32_t cAscii1 = _T('\x007F'); char32_t cLatin11 = _T('\x00FF'); // Geht nicht (error: invalid universal character): char32_t cHighSurrogateStart2 = _T('\uD800'); char32_t cHighSurrogateEnd2 = _T('\uDBFF'); char32_t cLowSurrogateStart2 = _T('\uDC00'); char32_t cLowSurrogateEnd2 = _T('\uDFFF'); char32_t cAscii2 = _T('\u007F'); char32_t cLatin12 = _T('\u00FF'); // Geht nicht (error: incomplete universal character name) char32_t cHighSurrogateStart3 = _T('\UD800'); char32_t cHighSurrogateEnd3 = _T('\UDBFF'); char32_t cLowSurrogateStart3 = _T('\UDC00'); char32_t cLowSurrogateEnd3 = _T('\UDFFF'); char32_t cAscii3 = _T('\U007F'); char32_t cLatin13 = _T('\U00FF');
-
Hallo,
der Fehler 'incomplete universal character name' kommt, weil \U 8 Zeichen danach erwartet, also z.B.
'\U00000000'
.Lies mal String and Character Literals (C++) unter Abschnitt "Surrogate Pairs". Es ist also nicht erlaubt Werte im Bereich D800-DFFF anzugeben (daher der Fehler 'invalid universal character'), sondern du mußt den passenden 'code point' dazu angeben - unter The Surrogate Pair Calculator etc. gibt es eine Tabelle dazu (etwas nach unten scrollen).