12 ноября 2019 г. 9: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 - это не правильно. но даже если уже есть такая ситуация которую правильно сделать нельзя (и не важно что в сторонней проге кодировка гвоздями) - совет только копать в сторону преобразования бинарных данных в строку

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

Комментарии

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

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

СБ
5 декабря 2019 г. 8:01
Сергей Бедерин

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

  • Результат:60баллов,
  • Очки рейтинга-1
АС
4 декабря 2019 г. 6:39
Артур Салмин

C++ - Тест 005. Структуры и Классы

  • Результат:33баллов,
  • Очки рейтинга-10
СТ
2 декабря 2019 г. 16:05
Сергей Тимченко

Qt - Тест 001. Сигналы и слоты

  • Результат:68баллов,
  • Очки рейтинга-1
Последние комментарии
6 декабря 2019 г. 12:47
Евгений Легоцкой

я подумал насчёт debug/release, но мне показалось - это сильно очевидным )))) Насчёт cmake согласен - он лучше
r
6 декабря 2019 г. 12:46
romankoshelev

С cmake разобрался. Всетаки писать на нем сильно проще. С размером dll тоже разобрался. windeployqt надо давать флаг --release (тогда библиотеки в 20 раз меньше)
6 декабря 2019 г. 12:40
Евгений Легоцкой

Конечно, хорошо бы это дело и на cmake сделать, но если честно, в задачах у меня такого нет, а делать специально только это сейчас времени тоже не хватает. увы. А что касается гигабайта Qt…
r
6 декабря 2019 г. 11:37
romankoshelev

А что сделать чтоб qt не тащило весь свой гигабайт в инсталлер?
Сейчас обсуждают на форуме
6 декабря 2019 г. 7:10
qml_puthon_user

Доброго времени суток. Пытаюсь сделать отображение с веб-камеры в графическом интерфейсе написанном на qml. Код программы: #системные библиотекиimport cv2import numpy as npimport…
5 декабря 2019 г. 16:12
Евгений Легоцкой

Это уже кастомная стилизация. Придётся отключать обрамление и самостоятельно реализовывать ресайз окна, его перемещение, стиль и т.д. Вот статья, как отключить обрамление окна - QML …
5 декабря 2019 г. 4:27
qml_puthon_user

Вот код, вдруг, кому поможет. Код основной формы: import QtQuick 2.12import QtQuick.Controls 2.12import QtQuick.Layouts 1.3import "./Components/Panels" as PanelsApplicationWindow{…
5 декабря 2019 г. 2:50
Евгений Легоцкой

Создавайте новые темы, чтобы не было всё в куче.
4 декабря 2019 г. 22:07
qml_puthon_user

Спасибо за помощь! :) Я попытаю надежды в ожидании QtQuick3D от Riverbank'a. :)
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB