3 Stimmen

Wofür genau steht U+ und warum kann ich in meiner C++-Anwendung keine Tabelle mit Unicode-Zwischenzeichenfolgen erstellen?

Ich versuche gerade, eine Anwendung von Java + Swing nach C++ + Qt zu konvertieren. An einem Punkt musste ich mich mit einigen Unicode-Zwischenstufen befassen. In Java war das ziemlich einfach:

private static String[] hiraganaTable = {
    "\u3042", "\u3044", "\u3046", "\u3048", "\u304a", 
    "\u304b", "\u304d", "\u304f", "\u3051", "\u3053", 
    ...
}

...während ich in C++ Probleme habe:

QString hiraganaTable[] = {
    "\x30\x42", "\x30\x44", "\x30\x46", "\x30\x48", "\x30\x4a", 
    "\x30\x4b", "\x30\x4d", "\x30\x4f", "\x30\x51", "\x30\x53", 
    ...
};

Ich konnte nicht verwenden \u in VS2008, weil ich einen Haufen von Warnungen der Form bekam:

Zeichen, das durch den Universal-Zeichen-Namen ' \u3042 ' kann in der aktuellen Codepage nicht dargestellt werden (1250)

Und nennen Sie mich nicht dumm, ich habe versucht, Datei->Erweiterte Speicheroptionen zu verwenden, ohne Erfolg, die Codepage schien sich nicht zu ändern. Anscheinend ist das ein bekanntes Problem: Erstellen eines UTF-8-Zeichenfolgenliterals in Visual C++ 2008

Die Tabelle, die ich verwende, ist ziemlich kurz, so dass ich sie mit Hilfe von Vim und etwas einführender regexp-Magie in \x30\x42 Notation. Leider würden die QStrings bei einer solchen Eingabe nicht richtig initialisiert. Ich habe alles ausprobiert. fromAscii(), fromUtf8(), fromLocal8Bit(), QString(QByteArray), das funktioniert. Als ich dann versuchte, U+3042 ohne BOM in eine Datei zu schreiben und sie dann im Hex-Modus anzuschauen, fand ich heraus, dass sie sich tatsächlich als "E3 81 82" . Plötzlich schien ein Eintrag wie dieser zu funktionieren mit QString::fromAscii() . Jetzt frage ich mich, für wie viel genau das "U+" in "U+3042" steht (da 0xE38182 - 0x3042 = E35140, sollte ich vielleicht besser diese magische Konstante zu all meinen Möchtegern-Unicode-Zeichen hinzufügen). Wie sollte ich von hier aus vorgehen, um ein Array von richtigen UTF-8 Zeichenfolgen zu erhalten?

4voto

Was Sie sehen, ist die UTF-8-Kodierung dieses Zeichens.

>>> u'\u3042'.encode('utf-8').encode('hex')
'e38182'

Wenn Sie sie alle in UTF-8 schreiben, sollte das kein Problem sein.

Das "U+" zeigt nur an, dass es sich um einen Unicode-Codepunkt und nicht um eine bestimmte Kodierung handelt.

EDIT:

Ein kleines Skriptlet in Python (dieselbe Sprache wie oben), um Ihnen den Einstieg zu erleichtern:

>>> print ',\n'.join(', '.join('"%s"' % (y.encode('utf-8').encode('string-escape')
      ,) for y in x) for x in [u'', u'', u''])
"\xe3\x81\x82", "\xe3\x81\x84", "\xe3\x81\x86", "\xe3\x81\x88", "\xe3\x81\x8a",
"\xe3\x81\x8b", "\xe3\x81\x8d", "\xe3\x81\x8f", "\xe3\x81\x91", "\xe3\x81\x93",
"\xe3\x81\x95", "\xe3\x81\x97", "\xe3\x81\x99", "\xe3\x81\x9b", "\xe3\x81\x9d"

4voto

MSalters Punkte 166675

Das Problem ist, dass C++ auf C basiert, das noch aus dem ASCII-Zeitalter stammt. Die "Standard"-Strings "abc" in C sind 8 Bit lang. Ihr Visual C++-Compiler hat jedoch 16-Bit-Unicode-Literale (UTF-16) mit einer etwas anderen Syntax: L"abc\u3042" . Der Typ solcher Literale ist wchar_t[N] anstelle von char[N] können Sie sie in einem std::wstring .

Qt versteht vollständig wchar_t und QStrings können ohne Konvertierungsprobleme direkt aus ihnen konstruiert werden.

2voto

Cheers and hth. - Alf Punkte 138555

"U+ dddd ", wobei jeder d ist eine hexadezimale Ziffer, die einen Unicode-Codepunkt bezeichnet.

Sie können keine 16-Bit-Werte in 8-Bit-Zeichen speichern; das ist das Hauptproblem, das Sie haben.

Verwenden Sie breite Zeichen, z. B. (dies sind String-Literale) L"\0x3042" o L"\u3042" .

Dann finden Sie heraus, wie Sie QString dazu bringen können, diese zu akzeptieren.

Hinweis: Visual C++ gibt eine sillywarning für die \U Notation, die innerhalb von Literalen verwendet wird, während g++ für diese Notation, die außerhalb von Literalen verwendet wird, dumme Warnungen ausgibt.

Prost & hth.,

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X