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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Socket->RecvAll Unicode  (Прочитано 5734 раз)
AlphaGh0St
Гость
« : Июнь 29, 2015, 21:11 »

Всем привет!
Столкнулся с такой проблемкой: отправлю строку в unicode ("hello"), читаю:
Код:
socket = server->nextPendingConnection();
socket->waitForReadyRead();
QByteArray msg = socket->readAll();
Я знаю про слот readyRead(), просто интересует считывание по readAll.

В результате в msg получаю это:
Цитировать
msg   "h\000e\000l"   QByteArray
   [ 0 ]   104 'h'   char
   [ 1 ]   0 '\0'   char
   [ 2 ]   101 'e'   char
   [ 3 ]   0 '\0'   char
   [ 4 ]   108 'l'   char
Т.е. было прочитано 5 байт. Прочитанное даже в qDebug() не вывести, т.к. присутствует 0, и в отладку выводится лишь символ "h".

Собственно, чему удивляться, QByteArray говорит сам за себя.
Подскажите, пожалуйста, как правильно принимать строки в unicode?

Благодарю.
Записан
Bepec
Гость
« Ответ #1 : Июнь 29, 2015, 22:22 »

Вы лучше покажите как отсылаете Улыбающийся
Записан
AlphaGh0St
Гость
« Ответ #2 : Июнь 29, 2015, 22:35 »

Отсылаю с программы на С++ VS13.
Код:
std::wstring buf = L"hello";
::send(socket, (char*)buf .c_str(), buf.size(), 0);
Записан
Bepec
Гость
« Ответ #3 : Июнь 29, 2015, 22:56 »

buf.size() вернёт 5, не так ли? А отсылаются байты, соответственно надо buf.size()*2, т.к. юникод и символ 2 байта?
Записан
AlphaGh0St
Гость
« Ответ #4 : Июнь 29, 2015, 23:37 »

Верно. Я умножал размер на 2, слово "hello" приходило. Но как дальше работать со строкой в двухбайтной кодировке? Хотя бы сравнить её с другой строкой, вывести в отладку, пройтись по ней поиском и т.д. и т.п. Там ведь каждый второй байт 0.
Записан
Bepec
Гость
« Ответ #5 : Июнь 30, 2015, 00:34 »

А вы запихайте её в wstring и работайте как работали. Сравнивайте, режьте и так далее.
Вы пытаетесь работать с её сырыми данными (buf .c_str() ), как с байтами. А надо работать со строкой (buf). Функции сравнения для юникода отличаются буковкой w в названии.
Записан
mezmay
Гость
« Ответ #6 : Июнь 30, 2015, 09:41 »

А если попробовать
Код:
QString QString::fromUtf16(const ushort * unicode, int size = -1)
Записан
AlphaGh0St
Гость
« Ответ #7 : Июнь 30, 2015, 09:46 »

Работаю с сырыми данными при отправке потому что, как давно читал, функции send без разницы что посылать. Она отправляет указанное количество байт, а там хоть строка, хоть структура.
В WinAPI знаю разделение функций для работы с ASNI и Unicode. В Qt тоже есть что-то подобное? Можно подробнее?
Записан
Bepec
Гость
« Ответ #8 : Июнь 30, 2015, 12:29 »

Нет нету, там всё в QString. Я писал вам про std функции - раз уж вы wstring используете.
Вам надо лишь преобразовать полученные байты в QString, как советует вам mezmay.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июнь 30, 2015, 12:36 »

QString QString::fromStdWString(const std::wstring & str)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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