Название: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 19, 2016, 13:16 Здравствуйте
Мне надо преобразовать русский текст из QDataStream. В реальной задаче я по сети передаю через QDataStream. В тестовом примере во вложении я беру строки на английском и на русском, кодирую их через QDataStream, а затем пробую раскодировать с помощью QTextDecoder, получившееся вывожу в QLabel. Можете подсказать как правильно декодировать? Что я делаю не так? Это основной текст примера: QString s1("Русский"); //строка на русском языке QTextDecoder *decoder = QTextCodec::codecForName("UTF-8")->makeDecoder(QTextCodec::IgnoreHeader); //Декодер из UTF8 QString s2("Russian"); //строка на английском языке QByteArray ba; //QByteArray, в который идет кодирование с помощью QDataStream QDataStream ds(&ba,QIODevice::ReadWrite); ds << s2; //"помещение" строки на англ. в QDataStream s2.clear(); //очищение строки (для чистоты эксперимента) s2 = decoder->toUnicode(ba); //декодирование ui->label->setText(s2); //установка в QLabel, раскодировалось в целом нормально ba.clear(); //очищение QByteArray (для чистоты эксперимента) //тоже самое для строки с русским текстом ds << s1; s1.clear(); s1 = decoder->toUnicode(ba); ui->label_2->clear(); ui->label_2->setText(s1); Название: Re: Преобразование из QDataStream русского текста Отправлено: ssoft от Август 19, 2016, 14:26 Сам принцип работы неверный.
Для сохранения и восстановления QString в QDataStream никакой кодировщик не нужен. Код: QString s1("Русский"); Если хотите пользоваться кодировщиком, то не нужен QDataStream Код: QString s1("Русский"); Нет никакой гарантии, что сериализация/десмериализация QString посредством QDataStream как-то равнозначно кодированию/декодированию. Скорее наоборот - гарантировано, что они не равнозначны. Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 22, 2016, 13:54 Спасибо, это правильно.
Кодировка у меня портится, когда я с помощью QDataStream пересылаю из QNX в Windows. Из Windows в Windows работает, из Windows в QNX тоже, а из QNX в Windows и из QNX в QNX не работает. QNX 6, QT 4.8. В вложении что-то типа клиент-серверного приложения. Сервер и клиент обмениваются QList<QStringList>. Сервер запускается сначала=)) Не знаете, в чем может быть проблема и какие варианты ее исправить? Название: Re: Преобразование из QDataStream русского текста Отправлено: Bepec от Август 22, 2016, 14:26 Вы код покажите. А там мб и разберёмся :D
Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 22, 2016, 14:40 Простите, про вложения забыл
Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 12:40 Проблемы приблизительно следующего плана:
Если я передаю слово "Лед" с сервера, то на на клиенте у меня появляются следующие кракозябры: ╨Ы╨╡╨┤. Если вставить их в онлайн-декодер Лебедева, то получим нужное слово "Лед". Там написано, что было сделано преобразование CP866 → UTF-8 https://www.artlebedev.ru/tools/decoder/ - декодер Лебедева Вывожу так: void MainWindow::M_writeLabel(QByteArray string) { QString s; QDataStream ds(&string,QIODevice::ReadOnly); ds >> s; ui->label->setText(s); } Можете подсказать, что сделать, чтобы в QLabel вместо кракозябр выводилось слово "Лед" Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 12:57 Покажите как формируются данные с строкой на стороне сервера.
Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 13:04 QByteArray socketArray;
QString s("Лед"); QDataStream ds1(&socketArray,QIODevice::WriteOnly); ds1 << s; socket->write(socketArray); Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 13:35 Исходники у вас в UTF-8, поэтому для Qt4 нужно явно использовать преобразование из UTF-8.
Например: Код
Но все это будет работать для исходников в UTF-8. Если кодировка исходников поменяется, нужно будет использовать другой кодек. Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 13:52 Я получаю QString (слово "Лед" в этом формате), который нужно перекодировать. Как его в данном случае лучше преобразовать в QByteArray? Подойдет ли метод toUtf8()?
Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 13:53 Подойдет ли метод toUtf8()? Да. Или более универсальное решение с QTextCodec::fromUnicode.Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 14:05 Можете поподробнее, пожалуйста.
Я получаю строку s в кодировке CP866 в QString. Как мне получить эту строку в формате UTF-8? Как-то так QString s1 = QTextCodec::codecForName("UTF-8)->toUnicode(s.toUtf8()) ? Это не помогает Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 14:46 Можете поподробнее, пожалуйста. Нельзя получить строку в кодировке отличной от Unicode. Вы получаете QByteArray со строкой в кодировке CP866, ее вы можете преобразовать в строку QString (она уже будет в Unicode), а затем еее можно преобразовать опять в QByteArray со строкой в кодировке UTF-8.Я получаю строку s в кодировке CP866 в QString. Как мне получить эту строку в формате UTF-8? Как-то так QString s1 = QTextCodec::codecForName("UTF-8)->toUnicode(s.toUtf8()) ? Это не помогает Т.е. это идет двойное преобразование: CP866 (QByteArray) -> Unicode (QString) -> UTF-8 (QByteArray) Все это делается через QTextCodec. Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 15:10 Пробую - строка меняет содержание.
А можно как-то из QByteArray или файла, в которых содержатся кракозябры ╨Ы╨╡╨┤получить (вывести) слово "Лед"? Мне предлагают вообще написать функцию декодирования. Можно как-то без этого обойтись? Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 15:29 Пробую - строка меняет содержание. Судя по всему это строка "Лед" в UTF-8. Например, она хранится в файле, тогда вы можете прочитать эти данные в QByteArray (QFile::readAll), а затем преобразовать в Unicode^А можно как-то из QByteArray или файла, в которых содержатся кракозябры ╨Ы╨╡╨┤получить (вывести) слово "Лед"? Мне предлагают вообще написать функцию декодирования. Можно как-то без этого обойтись? Код
Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 16:07 Что-то у меня и этот простой код не работает. Вы проверяли его?
Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 16:15 Вот набросал простой рабочий пример.
Название: Re: Преобразование из QDataStream русского текста Отправлено: YvenTitan от Август 23, 2016, 16:27 Я имел в виду, если в data.txt ╨Ы╨╡╨┤, а не "Лед"
Название: Re: Преобразование из QDataStream русского текста Отправлено: Old от Август 23, 2016, 16:30 Я имел в виду, если в data.txt ╨Ы╨╡╨┤, а не "Лед" :)То что вы приводите, это файл со словом "Лед" в кодировке UTF-8, если его открыть в кодировке CP866. :) Выложите ваш файл с данными, а я сделаю его чтение. |