Russian Qt Forum
Март 29, 2024, 09:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Преобразование QString в string(русский язык)  (Прочитано 14897 раз)
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« : Июль 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();//выводим сообщение с текстом стринга приемник

так вот если
поступают данные(пути файлов и папок) на английском то все нормально.
А если допустим поступают данные на русском языке например( /новая/игра)
то уже при распечатке стринга выводятся кракозябры.
Так что сделать чтобы и русский текст переводился корректно?
Записан
Serr500
Гость
« Ответ #1 : Июль 22, 2014, 15:07 »

Смотрим на определение класса std::string
Код:
typedef basic_string<char> string;
и понимаем, что он на самом деле массив char'ов. Следовательно, преобразовывать надо не к UTF-8, что по определению "немного не char", а в 8-bit. То есть, использовать QString::toLocal8Bit().
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Июль 22, 2014, 15:09 »

Следовательно, преобразовывать надо не к UTF-8, что по определению "немного не char", а в 8-bit.
Если целевая кодировка UTF-8, то нужно преобразовывать к UTF-8. Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #3 : Июль 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 для преобразования. Так, что я бы не советовал использовать эту функцию вообще.
« Последнее редактирование: Июль 22, 2014, 17:00 от navrocky » Записан

Гугль в помощь
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #4 : Июль 22, 2014, 19:23 »

завтра на работе попробую все варианты
Записан
Serr500
Гость
« Ответ #5 : Июль 23, 2014, 07:56 »

Вообще-то UTF-8 - 8 битная кодировка, как раз char.
Да что Вы говорите? Почитайте определение UTF-8. Один символ в UTF-8 может занимать несколько байт, до шести. Восьмибитность там означает совсем другое. Если рассматривать char как символ, а не как байт, то в случае не ASCII-символов массив UTF-8 даст "краказяблы".
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #6 : Июль 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)



« Последнее редактирование: Июль 23, 2014, 08:47 от koldun90 » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Июль 23, 2014, 08:57 »

Я же написал, что QString::fromStdString не надо пользоваться. Раз уж сделали в toLocal8Bit, тогда и обратно надо делать fromLocal8Bit. В MCBC по дефолту кодировка KOI-8R.
Записан

Гугль в помощь
Serr500
Гость
« Ответ #8 : Июль 23, 2014, 09:19 »

А чем не нравится QString::toStdString?
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #9 : Июль 23, 2014, 10:06 »

toLocal8Bit не сохраняет русский текст, по крайней мере я с таким лично сталкивался.
Помогло QString::toUtf8::data().
Записан
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #10 : Июль 23, 2014, 11:50 »

Я же написал, что QString::fromStdString не надо пользоваться. Раз уж сделали в toLocal8Bit, тогда и обратно надо делать fromLocal8Bit. В MCBC по дефолту кодировка KOI-8R.
А что нужно использовать за место QString::fromStdString?
тогда??
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #11 : Июль 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 плохие и что вместо них.
Записан

Гугль в помощь
koldun90
Крякер
****
Offline Offline

Сообщений: 345


Просмотр профиля
« Ответ #12 : Июль 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(); //ВСЕ РАВНО КРАКОЗЯБРЫ
то тоже кракозябры
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #13 : Июль 24, 2014, 22:28 »

Неужели я так плохо расписал  В замешательстве

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

Гугль в помощь
s_Creator
Гость
« Ответ #14 : Июль 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]
А дальше уже справильной строкой делай что хочешь и переводи куда хочешь
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.114 секунд. Запросов: 23.