Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [qt] кириллица и QByteArray 
V
    Опции темы
wester
Дата 2.5.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



Доброго времени суток.
Посылаю GET запрос с помощью QNetworkAccessManager, получаю ответ в виде QNetworkReply reply.
Код

QTextCodec *textCodec = QTextCodec::codecForName("utf-8");
    QString example(textCodec->toUnicode(reply->readAll()).toLocal8Bit());
    ui->lineEdit_2->setText(example); // пытаюсь вывести на форму


проблема в том, что в reply->readAll содержится кириллица и я ожидаемо получаю абракадабру. И так и сяк извращался - не понимаю, в чем затык. 
utf-8 взял, потому как сервер в хидерах указывает её.

Это сообщение отредактировал(а) wester - 2.5.2012, 15:25
PM MAIL   Вверх
bsa
Дата 2.5.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



wester, попробуй так:
Код
ui->lineEdit_2->setText(QString::fromUtf8(reply->readAll()));

PM   Вверх
wester
Дата 2.5.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



bsa
Так же абракадабра выводится вместо кириллицы. То есть это может быть не utf-8 , если fromUtf8() не помог? 
PM MAIL   Вверх
borisbn
Дата 2.5.2012, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



wester, попробуй выгрузить reply->readAll() в файл, затем открой его каким-нибудь Notepad++ и попереключай кодировки. Как увидишь русские буквы - готово, кодировка известна.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wester
Дата 2.5.2012, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



Прокликал все кодировки - ни одна не подошла

Это сообщение отредактировал(а) wester - 3.5.2012, 14:37
PM MAIL   Вверх
bsa
Дата 3.5.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



wester, выложи ответ сервера as-is (т.е. тупо сохрани в файл). Затем попробуй его открыть. Если не определишь кодировку, то выложи в открытый доступ мы посмотрим.
PM   Вверх
wester
Дата 3.5.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



bsa
не совсем понял, что именно нужно сохранить. Хидеры сервера при ответе могу прочитать, проблема именно в теле ответа. Сюда выложил полный ответ сервера в txt. Могу выложить программу (сорцы) на которой воспроизводится проблема.
PM MAIL   Вверх
borisbn
Дата 3.5.2012, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



wester, вот эти кракозябры
Цитата
i?eaao

в шестнадцатиричном представлении:
Цитата
69 3F 65 61 61 6F

это - действительно символы "i", вопросик, "e" и т.д.
Если эти байты пришли с сервера, то дело плохо... надо разбираться с запросом, кодировкой ответа и т.п.
У меня же есть подозрение, что те байты, которые пришли с сервера, сначала попали либо в QString, либо QTextCodec, либо ещё куда-то, а затем ты уже выложил их в файл.
Сохрани в файле именно то, что пришло с сервера. Или выложи здесь код, при помощи которого получен прикреплённый выше файл (только ту часть, которая вычитала данные из сервера и записала в файл. остальное - коннект, создание networkReply и т.п. пока не нужно)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
wester
Дата 3.5.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



Код

void Widget::on_pushButton_clicked()
{
    man=new QNetworkAccessManager(this);
    QNetworkRequest req(QUrl("http://translate.google.ru/translate_a/t?client=x&text=привет&sl=ru&tl=en"));
    man->get(req);
}

void Widget::finishTranslated(QNetworkReply *reply)
{
    QFile fileOut("g:\\out.txt");
    fileOut.open(QIODevice::WriteOnly|QIODevice::Text);
    fileOut.write(reply->readAll());
    fileOut.close();
}


вот исходник, как  я получаю страницу
PM MAIL   Вверх
borisbn
Дата 3.5.2012, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(borisbn @  3.5.2012,  13:18 Найти цитируемый пост)
Если эти байты пришли с сервера, то дело плохо... 

аж с души слегло... с гуглом всё в порядке))
проверил твой код один в один (ни строчки не изменил). если смотреть этот файл в Utf-8, то получаем
Цитата

{"sentences":[{"trans":"hi","orig":"привет","translit":"","src_translit":"privet"}],
"dict":[{"pos":"","terms":["Hi"]},{"pos":"имя существительное","terms":["regards","regard","compliment","remembrances","remembrance"]},
{"pos":"междометие","terms":["hello","hi","hail","howdy","bye","hullo","hallo","ciao","cheerio","cheer","chin-chin"]}],"src":"ru","server_time":1}

Тогда давай так. Сделай проект с минимальным кол-вом кода, который повторял бы эту проблему и выложи сюда


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
CuteBunny
Дата 3.5.2012, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 14.2.2008

Репутация: 1
Всего: 1



Попробуйте в main фукнции прописать:

Код

QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);



Код

ui->lineEdit_2->setText(QString::fromUtf8(reply->readAll())); //должно сработать!


Раз 
Цитата
проверил твой код один в один (ни строчки не изменил). если смотреть этот файл в Utf-8...
, значит данные приходят в utf-8, просто они отображаются не в нужной кодировке, т.е. Вы работаете скорее всего в другой кодовой странице, скорее всего Latin1 либо windows-1251.


Это сообщение отредактировал(а) CuteBunny - 3.5.2012, 16:50
PM MAIL   Вверх
borisbn
Дата 3.5.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



CuteBunny, может, конечно, и поможет, но я сейчас посмотрел - у меня в main() стоит
Код

    QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "Windows-1251" ) );
    QTextCodec::setCodecForTr( QTextCodec::codecForName( "Windows-1251" ) );

у меня шаблон на создание проекта такой...
однако, приведённый код дал указанный результат. тут в чём-то другом дело, ИМХО


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
CuteBunny
Дата 3.5.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 14.2.2008

Репутация: 1
Всего: 1



Цитата(borisbn @ 3.5.2012,  16:50)
CuteBunny, может, конечно, и поможет, но я сейчас посмотрел - у меня в main() стоит
Код

    QTextCodec::setCodecForCStrings( QTextCodec::codecForName( "Windows-1251" ) );
    QTextCodec::setCodecForTr( QTextCodec::codecForName( "Windows-1251" ) );

у меня шаблон на создание проекта такой...
однако, приведённый код дал указанный результат. тут в чём-то другом дело, ИМХО

Ну тогда я не знаю даже...

ИМХО, я всегда все проекты в utf-8 создаю, выставляю кодеки для строк, локали и тр + сохраняю исходники в utf-8 кодировке, мне так удобнее, хотя конечно был момент, когда файл на входе подавался от 1С в windows-1251, там просто при работе с файлом переключал кодировку на 1251 да и всё.

Это сообщение отредактировал(а) CuteBunny - 3.5.2012, 16:56
PM MAIL   Вверх
wester
Дата 3.5.2012, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: нет
Всего: 13



CuteBunny
Может я ошибаюсь, но подобное
Код

QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);

Нужно для строк, которые пишутся в самом коде, типа label->setText("nameOfControl");
Поправьте если ошибаюсь.


borisbn
Сделал проект, на котором воспроизводится ошибка. http://rghost.ru/37895038 Там же лежит файл (out.txt), который у меня на системе записывается.
Qt 4.7.4
PM MAIL   Вверх
bsa
Дата 3.5.2012, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(wester @  3.5.2012,  19:42 Найти цитируемый пост)
Сделал проект, на котором воспроизводится ошибка. http://rghost.ru/37895038 Там же лежит файл (out.txt), который у меня на системе записывается.
 smile  smile 

Цитата(wester @  3.5.2012,  19:42 Найти цитируемый пост)
Нужно для строк, которые пишутся в самом коде, типа label->setText("nameOfControl");

А чем по-твоему является:
Код
QNetworkRequest req(QUrl("http://translate.google.ru/translate_a/t?client=x&text=привет&sl=ru&tl=en"));
Я открыл твой исходник, а у меня кракозябры. Попробуй сделать так:
Код
QNetworkRequest req(QUrl(L"http://translate.google.ru/translate_a/t?client=x&text=привет&sl=ru&tl=en"));
А лучше вводи с контрола (QLineEdit)

Это сообщение отредактировал(а) bsa - 3.5.2012, 22:12
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.