Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Июль 22, 2014, 14:22



Название: Преобразование QString в string(русский язык)
Отправлено: koldun90 от Июль 22, 2014, 14:22
Всем добрый день возник небольшой вопрос как сделать преобразование из QString в string чтобы корректно отображал русский текст

я сделал так, но за место русских букв кракозябры

  
Код:
QString istochnik=path[0]; //берем данные из 1 списка
QString priemnik=path2[0]; //данные берем из 2 списка
msg.setText(istochnik);
msg.exec();  // выводим сообщение с текстом источника
msg.setText(priemnik);
msg.exec(); //выводим сообщение с текстом приемника
char *imja1;
char *imja2;
QByteArray ar=istochnik.toUtf8(); //записываем в поток байтов источник
imja1=ar.data();
QByteArray br=priemnik.toUtf8(); // записываем в поток байтов приемник
imja2=br.data();
string ist(imja1);  //создаем стринг источник
string preim(imja2);// создаем стринг приемник
msg.setText(QString::fromStdString(ist));
msg.exec(); //выводим сообщение с текстом стринга источник
msg.setText(QString::fromStdString(preim));
msg.exec();//выводим сообщение с текстом стринга приемник

так вот если
поступают данные(пути файлов и папок) на английском то все нормально.
А если допустим поступают данные на русском языке например( /новая/игра)
то уже при распечатке стринга выводятся кракозябры.
Так что сделать чтобы и русский текст переводился корректно?


Название: Re: Преобразование QString в string(русский язык)
Отправлено: Serr500 от Июль 22, 2014, 15:07
Смотрим на определение класса std::string
Код:
typedef basic_string<char> string;
и понимаем, что он на самом деле массив char'ов. Следовательно, преобразовывать надо не к UTF-8, что по определению "немного не char", а в 8-bit. То есть, использовать QString::toLocal8Bit().


Название: Re: Преобразование QString в string(русский язык)
Отправлено: Old от Июль 22, 2014, 15:09
Следовательно, преобразовывать надо не к UTF-8, что по определению "немного не char", а в 8-bit.
Если целевая кодировка UTF-8, то нужно преобразовывать к UTF-8. :)


Название: Re: Преобразование QString в string(русский язык)
Отправлено: navrocky от Июль 22, 2014, 16:53
Цитировать
UTF-8, что по определению "немного не char"

Вообще-то UTF-8 - 8 битная кодировка, как раз char.

Другое дело, не всё тут просто. Нельзя сказать, что для преобразования надо использовать только toLocal8Bit(), т.к. неизвестна дальнейшая судьба этой строки в std::string.

Если мы, к примеру, пишем в файл или выводим в stdout/err, то действительно надо делать toLocal8Bit(). Если мы эту строку передаем на сервер, который принимает UTF-8, то соответственно надо использовать toUtf8(). Т.е. надо действовать по ситуации. А при выводе в консоль под виндой надо вообще использовать кодировку CP866, с toLocal8Bit() вас ждет разочарование.

Хорошая практика хранить все строки внутри приложения в QString (которая UTF-16) и преобразовывать только в случае вывода этой строки наружу в нужной кодировке.

Конвертация из std::string в QString:
Код:
QString res = QString::fromLocal8Bit(stdStr.data(), stdStr.size());
QString res2 = QString::fromLocal8Bit(stdStr.c_str()); // менее эффективно, т.к. присутствует дополнительный просчет длины строки за кадром

Конвертация из QString в std::string:
Код:
QByteArray ba = qStr.toLocal8Bit();
std::string res = std::string(ba.data(), ba.size());

std::string res = std::string(qStr.toLocal8Bit().data()); // менее эффективно, т.к. присутствует дополнительный просчет длины строки за кадром

Добавлю, что в Qt4 QString::fromStdString по умолчанию использует кодировку latin1, которая херит любые не латинские символы. Чтобы изменить кодировку по умолчанию надо воспользоваться QTextCodec::setCodecForCStrings(). В Qt5 - без вариантов используется fromUtf8 для преобразования. Так, что я бы не советовал использовать эту функцию вообще.


Название: Re: Преобразование QString в string(русский язык)
Отправлено: koldun90 от Июль 22, 2014, 19:23
завтра на работе попробую все варианты


Название: Re: Преобразование QString в string(русский язык)
Отправлено: Serr500 от Июль 23, 2014, 07:56
Вообще-то UTF-8 - 8 битная кодировка, как раз char.
Да что Вы говорите? Почитайте определение UTF-8 (http://ru.wikipedia.org/wiki/UTF-8). Один символ в UTF-8 может занимать несколько байт, до шести. Восьмибитность там означает совсем другое. Если рассматривать char как символ, а не как байт, то в случае не ASCII-символов массив UTF-8 даст "краказяблы".


Название: Re: Преобразование QString в string(русский язык)
Отправлено: koldun90 от Июль 23, 2014, 08:43
вообщем не один из вариантов не работает:
пробовал так:
1) вариант
Код:
QString istochnik=path[0]
QByteArray ba = istochnik.toLocal8Bit();
std::string res = std::string(ba.data(), ba.size());
msg.setText(QString::fromStdString(ist));
msg.exec(); //ВЫВОДИТ КРАКОЗЯБРЫ ЕСЛИ НА РУССКОМ

2) вариант
Код:
QString istochnik=path[0]
std::string res = std::string(istochnik.toLocal8Bit().data());
msg.setText(QString::fromStdString(ist));
msg.exec(); //ВСЕ РАВНО КРАКОЗЯБРЫ

ЧТО можно еще сделать помогите....
кстати работаю в Unix(MCBC)





Название: Re: Преобразование QString в string(русский язык)
Отправлено: navrocky от Июль 23, 2014, 08:57
Я же написал, что QString::fromStdString не надо пользоваться. Раз уж сделали в toLocal8Bit, тогда и обратно надо делать fromLocal8Bit. В MCBC по дефолту кодировка KOI-8R.


Название: Re: Преобразование QString в string(русский язык)
Отправлено: Serr500 от Июль 23, 2014, 09:19
А чем не нравится QString::toStdString?


Название: Re: Преобразование QString в string(русский язык)
Отправлено: Fregloin от Июль 23, 2014, 10:06
toLocal8Bit не сохраняет русский текст, по крайней мере я с таким лично сталкивался.
Помогло QString::toUtf8::data().


Название: Re: Преобразование QString в string(русский язык)
Отправлено: koldun90 от Июль 23, 2014, 11:50
Я же написал, что QString::fromStdString не надо пользоваться. Раз уж сделали в toLocal8Bit, тогда и обратно надо делать fromLocal8Bit. В MCBC по дефолту кодировка KOI-8R.
А что нужно использовать за место QString::fromStdString?
тогда??


Название: Re: Преобразование QString в string(русский язык)
Отправлено: navrocky от Июль 24, 2014, 16:17
Я же написал, что QString::fromStdString не надо пользоваться. Раз уж сделали в toLocal8Bit, тогда и обратно надо делать fromLocal8Bit. В MCBC по дефолту кодировка KOI-8R.
А что нужно использовать за место QString::fromStdString?
тогда??

Я выше всё подробно написал:
http://www.prog.org.ru/index.php?topic=27354.msg198135#msg198135

И почему from/toStdString плохие и что вместо них.


Название: Re: Преобразование QString в string(русский язык)
Отправлено: koldun90 от Июль 24, 2014, 19:02
Хорошо если я делаю так

Код:
QString istochnik=path[0]
QByteArray ba = istochnik.toLocal8Bit();
std::string res = std::string(ba.data(), ba.size());

И распечатываю так
Код:
msg.setText(QString::fromStdString(ist));
msg.exec(); //ВЫВОДИТ КРАКОЗЯБРЫ ЕСЛИ НА РУССКОМ

Али так
Код:
QString istochnik=path[0]
std::string res = std::string(istochnik.toLocal8Bit().data());

Код:
msg.setText(QString::fromStdString(ist));
msg.exec(); //ВСЕ РАВНО КРАКОЗЯБРЫ
то тоже кракозябры


Название: Re: Преобразование QString в string(русский язык)
Отправлено: navrocky от Июль 24, 2014, 22:28
Неужели я так плохо расписал  :-\

Делай так:
Код:
msg.setText(QString::fromLocal8Bit(ist.c_str()));
msg.exec();


Название: Re: Преобразование QString в string(русский язык)
Отправлено: s_Creator от Июль 25, 2014, 06:23
Хорошо если я делаю так

Код:
QString istochnik=path[0]
...;
...
именно в этой строке проблема. Надо изначально привести из кодировки в которой храниться path[0] в юникод в котором храниться QString .
для этого использовать один из методов
Код:
QString istochnik =  QString::fromStdString (path[0])
QString istochnik =  QString::fromLocal8Bit(path[0])
и возможно настроить кодеки.
смотри
Код:
void QTextCodec::setCodecForLocale ( QTextCodec * c ) [static]
А дальше уже справильной строкой делай что хочешь и переводи куда хочешь