Название: Преобразование QString в string(русский язык) Отправлено: koldun90 от Июль 22, 2014, 14:22 Всем добрый день возник небольшой вопрос как сделать преобразование из QString в string чтобы корректно отображал русский текст
я сделал так, но за место русских букв кракозябры Код: QString istochnik=path[0]; //берем данные из 1 списка так вот если поступают данные(пути файлов и папок) на английском то все нормально. А если допустим поступают данные на русском языке например( /новая/игра) то уже при распечатке стринга выводятся кракозябры. Так что сделать чтобы и русский текст переводился корректно? Название: Re: Преобразование QString в string(русский язык) Отправлено: Serr500 от Июль 22, 2014, 15:07 Смотрим на определение класса std::string
Код: typedef basic_string<char> string; Название: 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 в std::string: Код: QByteArray ba = qStr.toLocal8Bit(); Добавлю, что в 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] 2) вариант Код: QString istochnik=path[0] ЧТО можно еще сделать помогите.... кстати работаю в 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] И распечатываю так Код: msg.setText(QString::fromStdString(ist)); Али так Код: QString istochnik=path[0] Код: msg.setText(QString::fromStdString(ist)); Название: Re: Преобразование QString в string(русский язык) Отправлено: navrocky от Июль 24, 2014, 22:28 Неужели я так плохо расписал :-\
Делай так: Код: msg.setText(QString::fromLocal8Bit(ist.c_str())); Название: Re: Преобразование QString в string(русский язык) Отправлено: s_Creator от Июль 25, 2014, 06:23 Хорошо если я делаю так именно в этой строке проблема. Надо изначально привести из кодировки в которой храниться path[0] в юникод в котором храниться QString .Код: QString istochnik=path[0] для этого использовать один из методов Код: QString istochnik = QString::fromStdString (path[0]) смотри Код: void QTextCodec::setCodecForLocale ( QTextCodec * c ) [static] |