Russian Qt Forum

Qt => Вопросы новичков => Тема начата: YvenTitan от Август 19, 2016, 13:16



Название: Преобразование из 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("Русский");
QByteArray ba;
QDataStream out_stream( &ba,QIODevice::WriteOnly );
out_stream << s1;

s1.clear();
QDataStream in_stream( &ba,QIODevice::ReadOnly );
in_stream >> s1;

Если хотите пользоваться кодировщиком, то не нужен QDataStream

Код:
QString s1("Русский");
QByteArray ba = decoder->fromUnicode( s1 );
...
s1.clear();
s1 = decoder->toUnicode( ba );

Нет никакой гарантии, что сериализация/десмериализация 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.
Например:
Код
C++ (Qt)
QString s( trUtf8( "Лед" ) );
QString s = QString::fromUtf8( "Лед" );
QString s = QTextCodec::codecForName( "UTF-8" )->toUnicode( "Лед" );
 

Но все это будет работать для исходников в 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
Можете поподробнее, пожалуйста.
Я получаю строку s в кодировке CP866 в QString. Как мне получить эту строку в формате UTF-8?
Как-то так QString s1 = QTextCodec::codecForName("UTF-8)->toUnicode(s.toUtf8())  ?
Это не помогает
Нельзя получить строку в кодировке отличной от Unicode. Вы получаете QByteArray со строкой в кодировке CP866, ее вы можете преобразовать в строку QString (она уже будет в Unicode), а затем еее можно преобразовать опять в QByteArray со строкой в кодировке UTF-8.
Т.е. это идет двойное преобразование:
CP866 (QByteArray) -> Unicode (QString) -> UTF-8 (QByteArray)

Все это делается через QTextCodec.


Название: Re: Преобразование из QDataStream русского текста
Отправлено: YvenTitan от Август 23, 2016, 15:10
Пробую - строка меняет содержание.
А можно как-то из QByteArray или файла, в которых содержатся кракозябры ╨Ы╨╡╨┤получить (вывести) слово "Лед"?
Мне предлагают вообще написать функцию декодирования. Можно как-то без этого обойтись?


Название: Re: Преобразование из QDataStream русского текста
Отправлено: Old от Август 23, 2016, 15:29
Пробую - строка меняет содержание.
А можно как-то из QByteArray или файла, в которых содержатся кракозябры ╨Ы╨╡╨┤получить (вывести) слово "Лед"?
Мне предлагают вообще написать функцию декодирования. Можно как-то без этого обойтись?
Судя по всему это строка "Лед" в UTF-8. Например, она хранится в файле, тогда вы можете прочитать эти данные в QByteArray (QFile::readAll), а затем преобразовать в Unicode^
Код
C++ (Qt)
QByteArray data = file.readAll();
QString text = QTextCodec::codecForName( "UTF-8" )->toUnicode( data );
label->setText( text ); // В text находится строка "Лед" в Unicode.
 


Название: 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. :)
Выложите ваш файл с данными, а я сделаю его чтение.