Qt QString от низ - Странни букви

Всеки път, когато се опитам да преобразувам std::string в QString с тази буква в него ('ß'), QString ще се превърне в нещо като "Ã" или нещо друго наистина странно писма. Какво не е наред? Използвах този код и той не предизвика никакви грешки или предупреждения!

std::string content = "Heißes Teil.";
ui->txtFind_lang->setText(QString::fromStdString(content));

std::string няма проблем с този знак. Дори го записах в текстов файл без проблеми. И така, какво правя грешно?


person Normal People Scare Me    schedule 22.03.2013    source източник


Отговори (2)


Трябва да зададете кодека на UTF-8:

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

По подразбиране Qt използва кодирането Latin-1, което е ограничено. Добавяйки този код, вие задавате кодирането по подразбиране на UTF-8, което ви позволява да използвате много повече знаци.

person antoyo    schedule 22.03.2013
comment
Редактирах отговора, за да добавя обяснения. Между другото, бихте ли могли да маркирате този отговор като приет отговор, ако ви е помогнал? - person antoyo; 23.03.2013

Въпреки че отговорът< на antoyo /a> работи, не бях много сигурен защо. И така, реших да проуча.

Всичките ми документи са кодирани в UTF-8, както и повечето уеб страници. Символът ß има UTF кодова точка UTF+00DF.

Тъй като UTF-8 е кодиране с променлива дължина, в двоичната форма ß ще бъде кодирано като 11000011 10011111 или C3 9F. Тъй като по подразбиране Qt разчита на Latin1 кодиране. Ще се чете ß като два различни знака. Първият C3 ще се съпостави с Ã, а вторият 9F няма да се съпостави с нищо, тъй като Latin1 не разпознава байтове между 128-159 (в десетичен знак).

Ето защо ß се появява като Ã, когато се използва кодиране Latin1.


Странична бележка: Може да искате да освежите как работи UTF-8 кодирането, защото иначе изглежда малко неинтуитивно, че ß отнема два байта, въпреки че неговата кодова точка DF е по-малка от FF и трябва да консумира само един байт.

person Vishesh Handa    schedule 23.03.2013