|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
15.04.2014, 20:59 | #1 |
Новичок
Джуниор
Регистрация: 15.04.2014
Сообщений: 2
|
Отличия в кодировках в Qt 4.8.4 и Qt 5.2
В общем проблема такая…. Многими годами раньше кем-то был написан клиент под пропускную систему организации. Этот клиент работает с внешней платой на базе микроконтроллера Микрочип, который контролирует несколько конечных датчиков, работающих с брелоками радиочастотной идентификации и т.д.
Далее эта внешняя плата пишет информацию о прошедшем человеке в базу MySQL. Так вот. Попросили сотрудники написать новый дополнительный клиент, такой что бы выводил фотографии сотрудников большего размера, что бы было видно на экране компа с более дальнего расстояния и что бы мог работать с сетью, что бы по сети передавать информацию о проходящих сотрудниках. Поскольку начал изучать Qt, решил написать этот новый клиент на С++ с использованием Qt. Вроде все сделал, получилось. Но все нормально работало в Qt 4.8.4, а в Qt 5.2 все оказалось не очень классно. Возник вопрос в кодировке… На на боевом сервере MySQL установлена кодировка по умолчанию latin1. При такой кодировке по умолчанию (на сервере) старый клиент выводит нормально кирилицу в свои элементы управления и нормально работает с внешней платой. Так что менять кодировку боевого сервера MySQL нет возможности. В проге с использованием Qt 4.8.4 выводит все нормально. Для демонстрации набросал небольшой примерчик (скрин первой формы во вложении) А тотже пример скомпилированный с Qt 5.2 выводит в поле с кодеком кракозябры (скрин второй формы во вложении). Что делать? Уже перепробовал много разных вариантов работы с кодировками, ничего не выходит в Qt 5.2. Что же такого разного? Очень прошу помочь! Вот исходный код демонстрационного примерчика: #include "widget.h" #include <QApplication> #include <QtSql> //для работы с базой данных #include <QVBoxLayout> #include <QLabel> #include <QLineEdit> #include <QMessageBox> #include <QTextCodec> #define CodecWin(str) codecWin->toUnicode(str) #define CodecUtf(str) codecUtf->toUnicode(str) int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; QSqlDatabase m_db; //объект базы данных сервера MySQL QSqlQuery *m_pqueryDB; //для запросов к базе данных сервера MySQL QTextCodec *codecWin; //кодеки для работы в программе QTextCodec *codecUtf; QTextCodec *codecUtf2; QString m_Query; //строка запроса к базе данных QString m_LastName; QByteArray m_LastName2; //инициализируем используемые кодировки для шрифтов codecWin = QTextCodec::codecForName("Windows-1251"); codecUtf = QTextCodec::codecForName("UTF-8"); //codecWin = QTextCodec::codecForLocale(); //инициализируем драйвер MySQL m_db = QSqlDatabase::addDatabase("QMYSQL") ; m_pqueryDB = new QSqlQuery; m_db.setHostName("192.168.0.101"); //а можно вмето IP-адреса указывать имя компа (показано ниже) m_db.setDatabaseName("education"); //название базы данных на сервере MYSQL m_db.setUserName("root"); //имя пользователя на сервере MYSQL m_db.setPassword("YankMotor"); //пароль подключения к серверу MYSQL bool dbcon_ok = m_db.open(); if(!dbcon_ok) //если не удалось подключится к серверу MYSQL { return 0; } //формируем новый запрос к базе данных m_Query = "SELECT id, lastname FROM user WHERE id=14"; if(!(m_pqueryDB->exec(m_Query))) { return 0; } //если все хорошо то переводим результаты запроса из типа QVariant в нужный формат while(m_pqueryDB->next()) { m_LastName = CodecWin(m_pqueryDB->value(1).toByteArray()); //с перекодированием m_LastName2 = m_pqueryDB->value(1).toByteArray(); //и без } codecUtf2 = QTextCodec::codecForUtfText(m_LastN ame2); //узнаем имя кодека Utf //создаем вертикальное размещение елементов на форме QVBoxLayout* mainLayout = new QVBoxLayout(&w); //создаем элементы управления формы QLabel *label1 = new QLabel(CodecUtf("С кодеком")); QLabel *label2 = new QLabel(CodecUtf("Без кодека")); QLabel *label3 = new QLabel(CodecUtf("Имя кодека codecForUtfText")); QLineEdit *lineedit1 = new QLineEdit(m_LastName); QLineEdit *lineedit2 = new QLineEdit(m_LastName2); QLineEdit *lineedit3 = new QLineEdit(codecUtf2->name()); //и выводим имя кодека Utf //добавляем элементы в вертикальное размещение на форме mainLayout->addWidget(label1); mainLayout->addWidget(lineedit1); mainLayout->addWidget(label2); mainLayout->addWidget(lineedit2); mainLayout->addWidget(label3); mainLayout->addWidget(lineedit3); w.show(); return a.exec(); } |
18.04.2014, 18:41 | #2 |
Новичок
Джуниор
Регистрация: 15.04.2014
Сообщений: 2
|
Ура, решения найдено!
Ура!!! Покопавшись и просмотрев хексовые значения полученных строк в Qt 4.8 и Qt 5.2 убедился что в Qt 5.2 требуется перекодировка из юникода обратно в latin-1, а затем уже необходимо перекодировать latin-1 в windows-1251.
Вот что помогло: #define CodecWinToUni(str) CodecWinToUni->toUnicode(str) #define CodecUtfToUni(str) CodecUtfToUni->toUnicode(str) #define CodecLatinFromUni(str) codecLatin->fromUnicode(str) //добавил вот это QTextCodec *CodecWinToUni; //кодеки для работы в программе QTextCodec *CodecUtfToUni; QTextCodec *codecLatin; //добавил вот это //инициализируем используемые кодировки для шрифтов CodecWinToUni = QTextCodec::codecForName("Windows-1251"); CodecUtfToUni = QTextCodec::codecForName("UTF-8"); codecLatin = QTextCodec::codecForName("ISO 8859-1"); //добавил вот это //и далее в цикле написал следующее, что и помогло while(m_pqueryDB->next()) { m_LastName = m_pqueryDB->value(1).toString(); //без кодека m_LastName2 = m_pqueryDB->value(1).toByteArray(); //и без кодека m_LastName = CodecWinToUni(CodecLatinFromUni(m_L astName)); //и вот это добавил с кодеком, ура помогло!!! } теперь и обеих версиях Qt прекрасно выводит кириллицу из моей базы данных. Надеюсь это решение кому-нибудь поможет!!! Всем спасибо! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Найти отличия | zet_in_me | Microsoft Office Excel | 2 | 01.10.2012 15:27 |
Отличия С и С++ | PriZZZraG | Общие вопросы C/C++ | 3 | 09.09.2012 06:43 |
отличия С# от C++/CLR | dampirik | Общие вопросы .NET | 13 | 14.12.2010 11:27 |
Отличия Си и VBA | std№1211-29-31 | Общие вопросы C/C++ | 2 | 11.04.2010 16:30 |
отличия EXCEPT от UNION | Neymexa | Помощь студентам | 1 | 24.03.2010 19:52 |