Название: Socket->RecvAll Unicode Отправлено: AlphaGh0St от Июнь 29, 2015, 21:11 Всем привет!
Столкнулся с такой проблемкой: отправлю строку в unicode ("hello"), читаю: Код: socket = server->nextPendingConnection(); В результате в msg получаю это: Цитировать msg "h\000e\000l" QByteArray Т.е. было прочитано 5 байт. Прочитанное даже в qDebug() не вывести, т.к. присутствует 0, и в отладку выводится лишь символ "h".[ 0 ] 104 'h' char [ 1 ] 0 '\0' char [ 2 ] 101 'e' char [ 3 ] 0 '\0' char [ 4 ] 108 'l' char Собственно, чему удивляться, 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"; Название: 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)
|