Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [qt] кириллица и QByteArray


Автор: wester 2.5.2012, 15:25
Доброго времени суток.
Посылаю 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 взял, потому как сервер в хидерах указывает её.

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

Автор: wester 2.5.2012, 16:51
bsa, 
Так же абракадабра выводится вместо кириллицы. То есть это может быть не utf-8 , если fromUtf8() не помог? 

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

Автор: wester 2.5.2012, 23:19
Прокликал все кодировки - ни одна не подошла

Автор: bsa 3.5.2012, 12:24
wester, выложи ответ сервера as-is (т.е. тупо сохрани в файл). Затем попробуй его открыть. Если не определишь кодировку, то выложи в открытый доступ мы посмотрим.

Автор: wester 3.5.2012, 13:04
bsa, 
не совсем понял, что именно нужно сохранить. Хидеры сервера при ответе могу прочитать, проблема именно в теле ответа. http://rghost.ru/37888945 выложил полный ответ сервера в txt. Могу выложить программу (сорцы) на которой воспроизводится проблема.

Автор: borisbn 3.5.2012, 13:18
wester, вот эти кракозябры
Цитата
i?eaao

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

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

Автор: wester 3.5.2012, 14:39
Код

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();
}


вот исходник, как  я получаю страницу

Автор: borisbn 3.5.2012, 15:05
Цитата(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}

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

Автор: CuteBunny 3.5.2012, 16:42
Попробуйте в 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.

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

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

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

Автор: CuteBunny 3.5.2012, 16:53
Цитата(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 да и всё.

Автор: wester 3.5.2012, 18:42
CuteBunny, 
Может я ошибаюсь, но подобное
Код

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

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


borisbn, 
Сделал проект, на котором воспроизводится ошибка. http://rghost.ru/37895038 Там же лежит файл (out.txt), который у меня на системе записывается.
Qt 4.7.4

Автор: bsa 3.5.2012, 22:11
Цитата(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)

Автор: wester 3.5.2012, 23:04
Проблема решена.
в main добавил

Код

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

А на контрол отображаю 
Код

ui->lineEdit->setText(QString::fromUtf8(reply->readAll()));

Спасибо всем отписавшимся!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)