Russian Qt Forum

Qt => Общие вопросы => Тема начата: Danila_Bagrofff от Июль 19, 2013, 17:07



Название: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:07
Проект по умолчанию написан в UTF-8.
Но сворачивать toBase64 необходимо кодировку CP1251.
Однако после перевода из UTF в CP1251 свертка становится "кривой".
Как можно придумать обойти сие недоразумение?
Код:
QString LoodsmanSpecialFunction::convertString(
        QString startString,
        QByteArray startCodec,
        QByteArray endCodec)
{
    QTextCodec *codec = QTextCodec::codecForName( startCodec );
    QTextCodec *codec1 = QTextCodec::codecForName( endCodec );
    QByteArray text;
    text.append(startString);
    startString = codec->toUnicode( text );
    startString = codec1->fromUnicode( startString );
    return startString;
}

QString LoodsmanSpecialFunction::createLinkObjectFromLoodsman(int idVers, QString nameDB)
{
    nameDB = convertString(nameDB, "UTF-8", "Windows-1251");
    QString string = "-|" + nameDB +"|0|" + QString().setNum(idVers);
    QByteArray text;
    text.append(string);
    QString link = QString("ask:Loodsman.URL?Action=Navigate,params=" + text.toBase64());
    return link;
}


Название: Re: кодировка с последующей сверткой
Отправлено: Old от Июль 19, 2013, 17:11
В QString строки хранятся в UNICODE. Если в nameDB правильное значение, то вам нужно произвести одно преобразование в CP1251.


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:15
чет туплю...

как бы я уже преобразовал..

на каком этапе еще не хватает чего-то?


Название: Re: кодировка с последующей сверткой
Отправлено: Old от Июль 19, 2013, 17:18
на каком этапе еще не хватает чего-то?
Я бы сказал есть лишнее. :)
Если конечно nameDB, передаваемое в createLinkObjectFromLoodsman имеет правильное значение.

Код
C++ (Qt)
QByteArray LoodsmanSpecialFunction::convertString(
       QString startString,    // Это строка в UNICODE или должно быть QByteArray
       QByteArray endCodec)
{
   QTextCodec *codec1 = QTextCodec::codecForName( endCodec );
   return codec1->fromUnicode( startString );
}
 


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:23
QString LoodsmanSpecialFunction::convertString(
        QString startString,              //входная строка в кодировке startCodec
        QByteArray startCodec,        //входная кодировка
        QByteArray endCodec           //кодировка на выходе
)
{
    QTextCodec *codec = QTextCodec::codecForName( startCodec );
    QTextCodec *codec1 = QTextCodec::codecForName( endCodec );
    QByteArray text;
    text.append(startString);
    startString = codec->toUnicode( text );
    startString = codec1->fromUnicode( startString );
    return startString;
}

ВОт так расшифрую.
На входе строка в UTF-8.
Соответсвенно и стартовый кодек UTF-8.

На выходе строка вроде как cp1251.
Вот только как бы реально не эта кодировка. Потому как после свертки я вижу всякую билиберду...


Название: Re: кодировка с последующей сверткой
Отправлено: Old от Июль 19, 2013, 17:26
ВОт так расшифрую.
На входе строка в UTF-8.
Вот как-то в этом я сомневаюсь.
Как присваивается эта строка? Откуда она берется?


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:28
понял. ща протестю.


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:41
локальная кодировка utf-8.
Имя БД читается из конфиг файла. А значит все-таки в ютф-формате в стринге хранится?

Также.
На старте проги из cp1251 в utf все корректно перевоится, но я точно знаю, что на входе программы строка в формате 1251.

А здесь мне надо выдать обратный вывод в 1251.


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 17:46
когда-то раньше проект был в cp1251 и проблем с переводом формата не было...

А сейчас что-то не хочется опять конвертить....


Название: Re: кодировка с последующей сверткой
Отправлено: Old от Июль 19, 2013, 17:57
локальная кодировка utf-8.
Имя БД читается из конфиг файла. А значит все-таки в ютф-формате в стринге хранится?
Не может там храниться в utf. При присвоении происходит преобразования.
Проверьте имя базы при входе в createLinkObjectFromLoodsman, если там все нормально, то нужно только одно преобразование fromUnicode.


Название: Re: кодировка с последующей сверткой
Отправлено: Danila_Bagrofff от Июль 19, 2013, 18:01
Old, спасибо.

В общем нефик по 100 раз конвертить QByteArray<->QString, тут и происходит потеря данных.

Сделал так.

Код:
QByteArray LoodsmanSpecialFunction::baConvertString(
        QString startString,
        QByteArray startCodec,
        QByteArray endCodec)
{
    QTextCodec *codec = QTextCodec::codecForName( startCodec );
    QTextCodec *codec1 = QTextCodec::codecForName( endCodec );
    QByteArray text;
    text.append(startString);
    startString = codec->toUnicode( text );
    return codec1->fromUnicode( startString );
}


QString LoodsmanSpecialFunction::createLinkObjectFromLoodsman(int idVers, QString nameDB)
{
    QString string = "-|" + nameDB +"|0|" + QString().setNum(idVers);
    QByteArray text = baConvertString(string, "UTF-8", "Windows-1251");
    QString link = QString("ask:Loodsman.URL?Action=Navigate,params=" + text.toBase64());
    return link;
}