Подтвердить что ты не робот

Что такое QString:: toUtf8?

Это может звучать как очевидный вопрос, но мне не хватает чего-то о том, как кодируется UTF-8 или как работает функция toUtf8.

Посмотрите на очень простую программу

QString str("Müller");
qDebug() << str << str.toUtf8().toHex();

Затем я получаю вывод

"Müller" "4dc383c2bc6c6c6572" 

Но я понял, что письмо ü должно быть закодировано как c3bc, а не c383c2bc.

Спасибо Johan

4b9b3361

Ответ 1

Это зависит от кодировки исходного кода.

Я склонен думать, что ваш файл уже закодирован в UTF-8, символ ü закодирован как C3 BC.

Вы вызываете конструктор QString::QString ( const char * str ), который, согласно http://doc.qt.io/qt-4.8/qstring.html#QString-8, преобразует вашу строку в Юникод, используя QString:: fromAscii(), который по умолчанию рассматривает вход как содержимое Latin1.

Поскольку C3 и BC оба действительны на латинском языке 1, представляя соответственно & Atilde; и & frac14;, преобразование их в UTF-8 приведет к следующим символам:

& Atilde; (C3) → C3 83

& frac14; (BC) → C2 BC

который приводит к строке, которую вы получаете: "4d c3 83 c2 bc 6c 6c 65 72"

Чтобы подвести итог, это двойная кодировка UTF-8.

Существует несколько вариантов решения этой проблемы:

1) Вы можете преобразовать исходный файл в латинский-1, используя ваш любимый текстовый редактор.

2) Вы можете надлежащим образом избежать символа ü в \xFC в литерной строке, поэтому строка не будет зависеть от кодировки файла.

3) вы можете сохранить файл и строку как данные UTF-8 и использовать QString str = QString::fromUtf8 ("Müller");

Обновление. Эта проблема больше не актуальна в QT5. http://doc.qt.io/qt-5/qstring.html#QString-8 заявляет, что теперь конструктор использует QString::fromUtf8() внутренне вместо QString::fromAscii(). Поэтому, пока кодировка UTF-8 используется последовательно, она будет использоваться по умолчанию.

Ответ 2

Запуск кода Я получаю ожидаемый результат

"4dc3bc6c6c6572"

Я думаю, проблема в том, что ваш вход не выводится. Проверьте кодировку исходного файла и посмотрите void QTextCodec::setCodecForCStrings ( QTextCodec * codec ) [static]