Russian Qt Forum

Qt => Работа с сетью => Тема начата: AlphaGh0St от Июнь 29, 2015, 21:11



Название: Socket->RecvAll Unicode
Отправлено: 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?

Благодарю.


Название: Re: Socket->RecvAll Unicode
Отправлено: Bepec от Июнь 29, 2015, 22:22
Вы лучше покажите как отсылаете :)


Название: Re: Socket->RecvAll Unicode
Отправлено: AlphaGh0St от Июнь 29, 2015, 22:35
Отсылаю с программы на С++ VS13.
Код:
std::wstring buf = L"hello";
::send(socket, (char*)buf .c_str(), buf.size(), 0);


Название: Re: Socket->RecvAll Unicode
Отправлено: Bepec от Июнь 29, 2015, 22:56
buf.size() вернёт 5, не так ли? А отсылаются байты, соответственно надо buf.size()*2, т.к. юникод и символ 2 байта?


Название: Re: Socket->RecvAll Unicode
Отправлено: AlphaGh0St от Июнь 29, 2015, 23:37
Верно. Я умножал размер на 2, слово "hello" приходило. Но как дальше работать со строкой в двухбайтной кодировке? Хотя бы сравнить её с другой строкой, вывести в отладку, пройтись по ней поиском и т.д. и т.п. Там ведь каждый второй байт 0.


Название: Re: Socket->RecvAll Unicode
Отправлено: Bepec от Июнь 30, 2015, 00:34
А вы запихайте её в wstring и работайте как работали. Сравнивайте, режьте и так далее.
Вы пытаетесь работать с её сырыми данными (buf .c_str() ), как с байтами. А надо работать со строкой (buf). Функции сравнения для юникода отличаются буковкой w в названии.


Название: Re: Socket->RecvAll Unicode
Отправлено: mezmay от Июнь 30, 2015, 09:41
А если попробовать
Код:
QString QString::fromUtf16(const ushort * unicode, int size = -1)


Название: Re: Socket->RecvAll Unicode
Отправлено: AlphaGh0St от Июнь 30, 2015, 09:46
Работаю с сырыми данными при отправке потому что, как давно читал, функции send без разницы что посылать. Она отправляет указанное количество байт, а там хоть строка, хоть структура.
В WinAPI знаю разделение функций для работы с ASNI и Unicode. В Qt тоже есть что-то подобное? Можно подробнее?


Название: Re: Socket->RecvAll Unicode
Отправлено: Bepec от Июнь 30, 2015, 12:29
Нет нету, там всё в QString. Я писал вам про std функции - раз уж вы wstring используете.
Вам надо лишь преобразовать полученные байты в QString, как советует вам mezmay.


Название: Re: Socket->RecvAll Unicode
Отправлено: Old от Июнь 30, 2015, 12:36
QString QString::fromStdWString(const std::wstring & str)