Russian Qt Forum
Ноябрь 22, 2024, 21:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: кодировка с последующей сверткой  (Прочитано 5010 раз)
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;
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Июль 19, 2013, 17:11 »

В QString строки хранятся в UNICODE. Если в nameDB правильное значение, то вам нужно произвести одно преобразование в CP1251.
Записан
Danila_Bagrofff
Гость
« Ответ #2 : Июль 19, 2013, 17:15 »

чет туплю...

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

на каком этапе еще не хватает чего-то?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июль 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 );
}
 
Записан
Danila_Bagrofff
Гость
« Ответ #4 : Июль 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.
Вот только как бы реально не эта кодировка. Потому как после свертки я вижу всякую билиберду...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июль 19, 2013, 17:26 »

ВОт так расшифрую.
На входе строка в UTF-8.
Вот как-то в этом я сомневаюсь.
Как присваивается эта строка? Откуда она берется?
Записан
Danila_Bagrofff
Гость
« Ответ #6 : Июль 19, 2013, 17:28 »

понял. ща протестю.
Записан
Danila_Bagrofff
Гость
« Ответ #7 : Июль 19, 2013, 17:41 »

локальная кодировка utf-8.
Имя БД читается из конфиг файла. А значит все-таки в ютф-формате в стринге хранится?

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

А здесь мне надо выдать обратный вывод в 1251.
Записан
Danila_Bagrofff
Гость
« Ответ #8 : Июль 19, 2013, 17:46 »

когда-то раньше проект был в cp1251 и проблем с переводом формата не было...

А сейчас что-то не хочется опять конвертить....
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июль 19, 2013, 17:57 »

локальная кодировка utf-8.
Имя БД читается из конфиг файла. А значит все-таки в ютф-формате в стринге хранится?
Не может там храниться в utf. При присвоении происходит преобразования.
Проверьте имя базы при входе в createLinkObjectFromLoodsman, если там все нормально, то нужно только одно преобразование fromUnicode.
Записан
Danila_Bagrofff
Гость
« Ответ #10 : Июль 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;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.261 секунд. Запросов: 23.