Wie zu Dekodieren, die ein QByteArray mit UTF-8 mit den Latin-1-fallback
Habe ich eine socket Verbindung zu einem IRC-server. Ich würde gerne konvertieren empfangenen Daten (QByteArray) zu QString. Weil im IRC, nicht jeder ist mit UTF-8, ich will versuchen, das zu entschlüsseln das QByteArray mit UTF-8:
QString s = QString::fromUtf8(array);
Das problem ist, dass Qt schweigend ersetzt "böse" Zeichen und gibt immer einen QString. Ich möchte "versuchen", die Decodierung, und wenn es kann nicht decodieren korrekt, fallback auf latin-1 Dekodieren.
Wie konnte ich das tun ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider sieht es nicht wie Qt bietet eine Decodierung routine, mit der Handhabung von ungültigen Sequenzen konfiguriert werden.
Stattdessen sollten Sie in der Lage sein, etwas zu tun, wie die folgenden:
Direkte Konvertierung zwischen UTF-8 und UTF-16 (d.h., keine Normalisierung) sollte verlustfrei und vollkommen reversibel. Wenn die Konvertierung von UTF-16 zu UTF-8 nicht zu den ursprünglichen Daten, dann ist das, weil die ursprünglichen Daten nicht gültig UTF-8.
Es ist möglich, aber unwahrscheinlich, dass unter normalen Umständen, dass der text in einer anderen Kodierung geschieht, gültig UTF-8, haben aber unterschiedliche Bedeutung in UTF-8 vs. die richtige Kodierung. Dieser text wird erkannt werden als UTF-8 und nicht wie vorgesehen angezeigt. Der einzige Weg, um dies zu vermeiden, ist die Vorherige Kenntnis der korrekte Codierung, z.B. mittels Protokoll Erklärungen, die die richtige Kodierung.
Andere Möglichkeit ist die Verwendung
std::wstring_convert
Teil der C++11 standard-Bibliothek.Beachten Sie, dass die Verwendung von
fromUtf16
mitchar16_t
hängt davon ab, diese änderung die nicht im Lieferumfang enthalten in der version von Qt, die Sie verwenden. Vermutlich werden Sie auch irgendwann etwas hinzufügen, wiefromStdU16String()
so kann man sagenQString::fromStdU16String(s16)
oder vielleicht hinzufügen implizite Konvertierungen, so können Sie einfach sagen:s = s16;
.Beachten Sie auch, dass die libstdc++ (die Standard-standard-library Implementierung für gcc) enthalten nicht diese Umwandlung Anlage noch. Visual Studio 2010 und später hat Sie, und libc++ ist es.