Что делает 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]