Что делает QString :: toUtf8? - PullRequest
       23

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

14 голосов
/ 31 января 2011

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

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

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

Тогда я получаю вывод

"Müller" "4dc383c2bc6c6c6572" 

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

Спасибо Johan

Ответы [ 2 ]

18 голосов
/ 31 января 2011

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

Я склонен думать, что ваш файл уже закодирован в 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

¼ (BC) -> C2 BC

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

Подводя итог, мы удваиваемКодировка UTF-8.

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

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

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

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

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

2 голосов
/ 31 января 2011

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

"4dc3bc6c6c6572"

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

...