2016-08-01 2 views
1

Я хочу, чтобы преобразовать строку в шестнадцатеричном и utf16 кодека QString , например, как то, что я добиваюсь от этого кода:Qt Преобразование UTF16 Hex строку QString

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

, но когда я пытаюсь следующий код каждую вещь пошло не так, как правильно это сделать.

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

Что делать, если вы просто выполните: 'QString str2 (hex);'? – wasthishelpful

+0

Преобразуйте str1 в UTF16 QBytearray, используйте toHex и сравните, если вы получите 0633. – hyde

+0

@wasthishelpful нет, что не работает вообще – AMCoded

ответ

4

Что не так с этим кодом?

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

Endian is! Это эквивалентно L"\x3306\x4406\x2706\x4506", а не L"\x0633\x0644\x0627\x0645".

Так, чтобы преодолеть эту проблему, вы можете добавить BOM в строку

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

не проверял, но это должно решить проблему.

Альтернативное решение состоит в переводе порядка байтов в символ Sigle UTF-16 (чтобы изменить его на малое значение).

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

oh, что это правильно. Я пропустил эту строку из документации QString :: fromUtf16. Эта функция проверяет маркер заказа байтов (BOM). Если он отсутствует, предполагается, что порядок байтов хоста принимается. ' спасибо, что спасете меня. – AMCoded

Смежные вопросы