Russian Qt Forum

Qt => Вопросы новичков => Тема начата: UndeadDragon от Декабрь 31, 2012, 01:35



Название: Проблема с получением QByteArray
Отправлено: UndeadDragon от Декабрь 31, 2012, 01:35
Всем привет. Есть такой небольшой баг, пожалуй просто его продемонстрирую.
Код:
void myClass::onResult(QNetworkReply* result){
QByteArray var = result->readAll(); //QNetworkReply наследован от QIODevice
...
}
Как результат var пустая строка, хотя result не пуст, какой именно не важно, всегда одинаково.
С тем же содержимым result иначе:
Код:
void myClass::onResult(QNetworkReply* result){
QString data = QObject::tr(result->readAll());
QByteArray var = QVariant(data).toByteArray();
...
}
Теперь var не пуста и содержит совершенно корректные данные.
По какой причине так происходит? Заранее спасибо.


Название: Re: Проблема с получением QByteArray
Отправлено: Dancing_on_water от Декабрь 31, 2012, 05:59
Как проверял, что массив пуст?


Название: Re: Проблема с получением QByteArray
Отправлено: Bepec от Декабрь 31, 2012, 10:40
Проблема % на 80 в кодировке. Стандартное преобразование QString(QByteArray) использует кодировку Ascii. Если в начале имеется нулевой символ, строка считается пустой :)

PS у тебя на tr какая кодировка стоит?


Название: Re: Проблема с получением QByteArray
Отправлено: UndeadDragon от Декабрь 31, 2012, 13:48
Как проверял, что массив пуст?
В отладочном пошаговом режиме.
Проблема % на 80 в кодировке. Стандартное преобразование QString(QByteArray) использует кодировку Ascii. Если в начале имеется нулевой символ, строка считается пустой :)

PS у тебя на tr какая кодировка стоит?
Тоже так подумал, только не вкуриваю как подправить. Вообще сервер в UTF возвращает текст или хрен знает в чем.
На tr я поставил UTF как раз.
Код:
QTextCodec *wincodec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForTr(wincodec);


Название: Re: Проблема с получением QByteArray
Отправлено: Old от Декабрь 31, 2012, 14:05
В отладочном пошаговом режиме.
А ты опробуй просто добавить отладочный вывод размера и посмотришь.


Название: Re: Проблема с получением QByteArray
Отправлено: Bepec от Декабрь 31, 2012, 14:15
Всё правильно. У тебя изза кодировки ascii строка режется до 0.

Потому делай проще - считывай в QByteArray и кодируй с помощью QTextCodec в Utf8. И на выходе у тебя будет строка как и после tr.


Название: Re: Проблема с получением QByteArray
Отправлено: UndeadDragon от Декабрь 31, 2012, 16:08
Всё правильно. У тебя изза кодировки ascii строка режется до 0.

Потому делай проще - считывай в QByteArray и кодируй с помощью QTextCodec в Utf8. И на выходе у тебя будет строка как и после tr.
Не совсем понял мысль. Если считывать в QByteArray, как в моем первом примере, то дальше уже ничего не получится, ибо не считается.
Сделал так пока в общем.
Код:
QByteArray var = tr(result->readAll()).toAscii();


Название: Re: Проблема с получением QByteArray
Отправлено: Bepec от Декабрь 31, 2012, 17:51
Что тебе сказать. Ты пропустил один шаг - перекодировку.

1 Считываешь - QByteArray.
2 Перекодируешь - QTextCodec.
3 На выходе - QString.

Второй шаг у тебя сейчас делается через tr, который вызывает тот же QTextCodec :D