Что делает QString:: toUtf8?

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

давайте посмотрим на очень простую программу

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

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

"Müller" "4dc383c2bc6c6c6572" 

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

спасибо Йохан!--3-->

2 ответов


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

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

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

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

à (C3) -> C3 83

¼ (до н. э.) -> С2 до н. э.

что приводит к строке, которую вы получаете: "4d С2 С3 83 года до н. э. 6c 6c 65 72"

подводя итог, это двойная кодировка UTF-8.

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

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

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

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 используется последовательно, будет использоваться по умолчанию.


запуск вашего кода я получаю ожидаемый результат

"4dc3bc6c6c6572"

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