2016-08-01 13 views
1

Ich möchte eine Zeichenfolge in hex und utf16 Codec QString zum Beispiel konvertieren wie das, was ich von diesem Code erreichen:Qt konvertieren UTF16 Hex String QString

QString str1 = QString::fromWCharArray(L"\x0633\x0644\x0627\x0645"); // what I want 

aber wenn ich versuche, den folgenden Code jedes Ding Was ist der richtige Weg dafür?

QByteArray hex = QByteArray::fromHex("0633064406270645"); 
// wrong text in str2 it should be equal to str1 
QString str2 = QString::fromUtf16((char16_t*)hex.data()); 
+0

Was ist, wenn Sie nur tun: 'QString str2 (hex);'? – wasthishelpful

+0

Wandeln Sie str1 in UTF16 QBytearray um, verwenden Sie toHex, und vergleichen Sie, ob Sie 0633 erhalten haben. – hyde

+0

@washishilfful Nein, das überhaupt nicht funktioniert – AMCoded

Antwort

4

Was ist falsch mit diesem Code?

QByteArray hex = QByteArray::fromHex("0633064406270645"); 
// wrong text in str2 it should be equal to str1 
QString str2 = QString::fromUtf16((char16_t*)hex.data()); 

Endian ist! Dies entspricht L"\x3306\x4406\x2706\x4506" und nicht L"\x0633\x0644\x0627\x0645".

Also, dieses Problem zu überwinden Sie BOM bespannen

QByteArray hex = QByteArray::fromHex("FEFF0633064406270645"); 
QString str2 = QString::fromUtf16((char16_t*)hex.data()); 

Hat es bisher nicht testen aber lösen sollte Problem hinzufügen.

Alternative Lösung ist die Reihenfolge der Bytes in Sigle UTF-16 Zeichen (um es in Little Endian zu ändern).

QByteArray hex = QByteArray::fromHex("3306440627064506"); 
QString str2 = QString::fromUtf16((char16_t*)hex.data()); 
+0

oh das ist richtig Ich vermisse diese Zeile aus der QString :: fromUtf16 Dokumentation 'Diese Funktion sucht nach einer Byte Order Mark (BOM). Wenn es fehlt, wird die Host-Byte-Reihenfolge angenommen. Danke, dass du mir Zeit gespart hast. – AMCoded