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

QString UTF8 -> WIN1251

QString, UTF8, winndows1251

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

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

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

5

Вам это нравится? Поделитесь в социальных сетях!

15
R
  • 12 ноября 2019 г. 20:17

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

    Алексей Внуков
    • 12 ноября 2019 г. 20:18
    • (ред.)

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

      Ruslan Polupan
      • 13 ноября 2019 г. 1:19

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

        Ruslan Polupan
        • 13 ноября 2019 г. 12:54

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

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

            получем...

            Если так

            1. QTextCodec* codecW = QTextCodec::codecForLocale();

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

              IscanderChe
              • 13 ноября 2019 г. 14:54

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

                Ruslan Polupan
                • 13 ноября 2019 г. 16:03

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

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

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

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

                  IscanderChe
                  • 13 ноября 2019 г. 16:32

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

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

                    Ruslan Polupan
                    • 13 ноября 2019 г. 16:51

                    возможно..

                      Алексей Внуков
                      • 13 ноября 2019 г. 16:58
                      • (ред.)

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

                        Алексей Внуков
                        • 13 ноября 2019 г. 16:59

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

                          Ruslan Polupan
                          • 13 ноября 2019 г. 17:41

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

                            Алексей Внуков
                            • 14 ноября 2019 г. 15:06

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

                              Ruslan Polupan
                              • 14 ноября 2019 г. 15:23

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

                                Комментарии

                                Только авторизованные пользователи могут публиковать комментарии.
                                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                • Последние комментарии
                                • IscanderChe
                                  12 апреля 2025 г. 17:12
                                  Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                                • AK
                                  1 апреля 2025 г. 11:41
                                  Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                                • Evgenii Legotckoi
                                  9 марта 2025 г. 21:02
                                  К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                                • VP
                                  9 марта 2025 г. 16:14
                                  Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                                • ИМ
                                  22 ноября 2024 г. 21:51
                                  Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…