Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2014, 20:59   #1
AlexYanky
Новичок
Джуниор
 
Регистрация: 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();
}
Изображения
Тип файла: jpg Qt48.jpg (14.7 Кб, 74 просмотров)
Тип файла: jpg Qt52.jpg (15.0 Кб, 76 просмотров)
AlexYanky вне форума Ответить с цитированием
Старый 18.04.2014, 18:41   #2
AlexYanky
Новичок
Джуниор
 
Регистрация: 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 прекрасно выводит кириллицу из моей базы данных.
Надеюсь это решение кому-нибудь поможет!!!
Всем спасибо!
AlexYanky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти отличия 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