Was genau macht U + stehen und warum kann ich nicht eine Tabelle von Unicode-Strings Zwischen in meiner C ++ Anwendung zu erstellen?

StackOverflow https://stackoverflow.com/questions/4261985

Frage

Ich versuche, eine Anwendung von Java + Swing C ++ + Qt zu konvertieren. An einem Punkt hatte ich mit einigen Unicode Intermediate zu beschäftigen. In Java, das war ziemlich einfach:

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

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

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 u in VS2008 verwenden \, weil ich einen Haufen Warnungen der Form bekommen:

  

Zeichen dargestellt durch universelle Zeichen Namen ‚\ u3042‘ kann nicht in der aktuellen Codepage dargestellt werden (1250)

Und nennen Sie mich nicht dumm, ich versuchte, File-> Erweiterte Speicheroptionen ohne Erfolg zu nutzen, die Codepage schien gar nicht zu ändern. Scheint, als ob dies ein bekanntes Problem: Wie eine UTF-8 Stringliteral in Visual C ++ 2008

erstellen

Die Tabelle ich benutze ziemlich kurz ist, so mit Hilfe von Vim und einiger einleitenden Ebene regexp-Magie, ich war in der Lage, es zu konvertieren \ x30 \ x42 Notation. Leider würden die QStrings nicht initialize richtig aus solchen Eingang. Ich habe alles versucht. fromAscii (), fromUtf8 (), fromLocal8Bit (), QString (QByteArray), die funktioniert. Dann versuchen U + 3042 ohne BOM in eine Datei zu schreiben und sie dann im Hex-Modus sehen, fand ich heraus, dass es tatsächlich stellt sich heraus, sein „E3 81 82“ . Plötzlich, wie dies ein Eintrag schien Arbeit mit QString :: fromAscii () . Jetzt bin verlassen ich frage mich, wie viel kostet genau die „U +“ steht für in „U + 3042“ (seit 0xE38182 - 0x3042 = E35140, würde ich vielleicht besser hinzufügen, um dieses magische Konstante für alle meine Unicode Zeichen Möchtegern-?). Wie soll ich von hier aus gehen eine Reihe von richtigen UTF-8-Strings zu bekommen?

War es hilfreich?

Lösung

Das Problem ist, dass C ++ auf C basiert, die stammt aus dem ASCII Alter zurück. Die "default" C-Strings "abc" sind 8 Bit. Ihre Visual C ++ Compiler hat 16 Bit Unicode (UTF-16) Literale allerdings mit einer etwas anderen Syntax: L"abc\u3042". Die Art solcher Literalen ist wchar_t[N] statt char[N], können Sie sie in einem std::wstring speichern kann.

Qt voll versteht wchar_t und QStrings können direkt von ihnen ohne Konvertierung Probleme aufgebaut werden.

Andere Tipps

Was Sie sehen, ist die UTF-8-Codierung des Zeichens.

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

Wenn Sie sie alle in schreiben UTF-8, dann sollten Sie in Ordnung sein.

Die „U +“ zeigt nur, dass Sie bei einem Unicode-Codepoint freuen wie auf einige spezifische Codierung gegenüber.

EDIT:

Eine kleine scriptlet zu erleichtern Ihnen den Einstieg in Python (gleiche Sprache wie oben):

>>> 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"

"U + dddd ", wobei jedes d ist eine hexadezimale Ziffer eines Unicode-Codepunkt bezeichnet.

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

Mit breiten Zeichen, zum Beispiel (Diese sind Stringliterale) L"\0x3042" oder L"\u3042".

Dann herauszufinden, wie man machen QString diejenigen akzeptieren.

. Hinweis: Visual C ++ wird für die \U Notation emittieren sillywarning innerhalb Literale verwendet, während g ++ wird sillywarnings emittieren für die Notation außerhalb Literalen

Prost & hth.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top