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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с получением QByteArray  (Прочитано 4364 раз)
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 не пуста и содержит совершенно корректные данные.
По какой причине так происходит? Заранее спасибо.
Записан
Dancing_on_water
Гость
« Ответ #1 : Декабрь 31, 2012, 05:59 »

Как проверял, что массив пуст?
Записан
Bepec
Гость
« Ответ #2 : Декабрь 31, 2012, 10:40 »

Проблема % на 80 в кодировке. Стандартное преобразование QString(QByteArray) использует кодировку Ascii. Если в начале имеется нулевой символ, строка считается пустой Улыбающийся

PS у тебя на tr какая кодировка стоит?
Записан
UndeadDragon
Гость
« Ответ #3 : Декабрь 31, 2012, 13:48 »

Как проверял, что массив пуст?
В отладочном пошаговом режиме.
Проблема % на 80 в кодировке. Стандартное преобразование QString(QByteArray) использует кодировку Ascii. Если в начале имеется нулевой символ, строка считается пустой Улыбающийся

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

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Декабрь 31, 2012, 14:05 »

В отладочном пошаговом режиме.
А ты опробуй просто добавить отладочный вывод размера и посмотришь.
Записан
Bepec
Гость
« Ответ #5 : Декабрь 31, 2012, 14:15 »

Всё правильно. У тебя изза кодировки ascii строка режется до 0.

Потому делай проще - считывай в QByteArray и кодируй с помощью QTextCodec в Utf8. И на выходе у тебя будет строка как и после tr.
Записан
UndeadDragon
Гость
« Ответ #6 : Декабрь 31, 2012, 16:08 »

Всё правильно. У тебя изза кодировки ascii строка режется до 0.

Потому делай проще - считывай в QByteArray и кодируй с помощью QTextCodec в Utf8. И на выходе у тебя будет строка как и после tr.
Не совсем понял мысль. Если считывать в QByteArray, как в моем первом примере, то дальше уже ничего не получится, ибо не считается.
Сделал так пока в общем.
Код:
QByteArray var = tr(result->readAll()).toAscii();
Записан
Bepec
Гость
« Ответ #7 : Декабрь 31, 2012, 17:51 »

Что тебе сказать. Ты пропустил один шаг - перекодировку.

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

Второй шаг у тебя сейчас делается через tr, который вызывает тот же QTextCodec Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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