Ruslan Polupan12 ноября 2019 г. 20:11

QString UTF8 -> WIN1251

QString, UTF8, winndows1251

Доброго времени суток.
Задача: в базу данных Firebird в поле типа BLOB (содержит набор SQL запросов которые по расписанию выполнятся на базе данных) записать строки:

QString strSQL = "UPDATE FUELS SET NAME = 'ДП-З-Евро5-ВО' WHERE FUEL_ID = 7;";

Как сконвертировать strSQL в win1251?
я уже мозг сломал изучая примеры....
Буду благодарен....

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
15
R

Добрий день, через QTextCodec

в параметре поля прописать колейт и нужную кодировку. больше конвертировать не нужно

Если не затруднит можно пример кода....

COLLATE к сожалению я менять не могу.

QTextCodec* codec1;
QTextCodec* codec2;

codec1 = QTextCodec::codecForName("UTF-8");
codec2 = QTextCodec::codecForLocale();

QString strSQL = "...";
QByteArray byteArrayContent;
byteArrayContent.insert(0, strSQL);
strSQL = codec1->toUnicode(byteArrayContent);
strSQL = codec2->fromUnicode(strSQL);
    int runScriptCroupID;
    QByteArray result;
    QTextCodec* codecU = QTextCodec::codecForName("UTF-8");
    QTextCodec* codecW = QTextCodec::codecForName("Windows-1251");
    result.insert(0, strSQL);
    strSQL = codecU->toUnicode(result);
    strSQL = codecW->fromUnicode(strSQL);
    QSqlQuery q;
    q.exec("SELECT GEN_ID(GEN_RUNSCRIPTSGROUPS,1) FROM RDB$DATABASE");
    q.next();
    runScriptCroupID = q.value(0).toInt();
    q.finish();
    foreach (int terminalID, m_terminals) {
        q.prepare("INSERT INTO RUNSCRIPTS (TERMINAL_ID, RUNSCRIPT_ID, RUNSCRIPTSGROUP_ID, CONNECT_ID, RUNDAT, SQLDATA, NEED_RESTART, APPLY, ISERROR, RESTARTMSG, RUNSRIPT_TYPE, DPROCESSED) "
                       "VALUES (:terminalID, GEN_ID(GEN_RUNSCRIPTS,1), :runScriptGroupID, 2, :scriptDate, :script, 'F', 'F', 'F', '', 0, NULL)");
        q.bindValue(":terminalID", terminalID);
        q.bindValue(":runScriptGroupID",runScriptCroupID);
        q.bindValue(":scriptDate", ui->dateEdit->date().toString("yyyy-MM-dd ")+"23:15:00");
        q.bindValue(":script" , strSQL);
        if(!q.exec()) qCritical(logCritical()) << "Не возможно добавить скрипт для АЗС" << terminalID << q.lastError().text();
    }

получем...

Если так

QTextCodec* codecW = QTextCodec::codecForLocale();

То получаем следующее:

А можно эти кракозябры сюда в виде текста скопировать? Или самостоятельно прогоните их через эту приблуду, посмотрите что из чего кодится.

Начнем сначала :-)
Перекодировку не используем.
Вот как отвображается BLOB в интерефейсе сторонней программы там ГВОЗДЯМИ 1251.

вот так отображается текст если я его сюда вставляю из буфера
?”?Y-?—-?•??N€??5-?’?z

А вот так реагирует декодер

Что-то я совсем заблудился....

Судя по скринам, и до кодировки и после кодировки одни и те же значения в BLOBе оказываются для "ДП-3-Евро5-ВО". Как так?

Пример, который привёл я, рабочий. В своё время написал перекодировщик файлов из Windows-1251 в UTF-8 и обратно, всё работает успешно. Возможно, что-то особенное на стороне БД.

возможно..

а почему именно в BLOB? он предназначен в для хранения бинарных дынных, может стоит реализацию базы данных пересмотреть?

я подозреваю что ситуация из-за использования поля не по назначению

Ну ка кбы уже лет 10 как работает :-)
Просто нужна отдельная прога для добавления таких записей, отдать клиентам чтобы мозг не парили....

повторю: BLOB - это бинарник, хранить обыкновенную строку в BLOB - это не правильно. но даже если уже есть такая ситуация которую правильно сделать нельзя (и не важно что в сторонней проге кодировка гвоздями) - совет только копать в сторону преобразования бинарных данных в строку

Я уже понял это, ковыряюсь сижу....

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
VD

C++ - Тест 001. Первая программа и типы данных

  • Результат:73баллов,
  • Очки рейтинга1
Ds

C++ - Тест 003. Условия и циклы

  • Результат:64баллов,
  • Очки рейтинга-1
o

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
D:

QML - Урок 016. База данных SQLite и работа с ней в QML Qt

Добрый день, пытаюсь разобраться и подргнать пример под себя. Есть бд с огромным количеством полей. В приложении на виджетах при использовании QTableView все работает и путем простого sql запрос…

Django - Урок 039. Добавление личных сообщений и чатов на сайте - Часть 2 (Счётчик диалогов и чатов с непрочитанными сообщениями)

Добавляйте поле файла в модель сообщения. И в форме сообщения указывайте, что поле с файлом.
s

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

все, я со всем разобрался!) Извините!)
s

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Доброго времени суток!) Я случайно набрел на вашу статью, и она помогла мне решить некоторые мои трудности, я прошел за вами по шагам, в попытках адаптировать это под себя, и возник вопрос. У ва…
Сейчас обсуждают на форуме
М

QML: изменение стиля при наведении и при нажатии на кнопку

enabled = false перестанет быть активной и не будет ни на что реагировать) Хм.. по-моему пробовал такое. Проверю ещё раз после работы. Ура, спасибо большо…
U

Динамическое наполнение StackView QML

Во затупил))) Спасибо за все))) StackView.push("ModuleTip1.qml") ну или в сложной иерархии StackView.push("qrc:/folder/ModuleTip1.qml") и всего делов... Не пойму, почему сра…

QEventLoop тормозит при удалении экземпляра

Думаю, что нет. Лучше вообще без исключений, но не всегда возможно.
s

Ключевое слово class

Разобрался,на стаковерфлоу нашел топик и понял почему так происходило .

Поведение пустой очереди std::queue

Спасибо, так и сделал.
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB