关于QT,C++,MySQL之间中文乱码问题的简单解决
2017-11-18 11:14
986 查看
中文编码之殇
上学期用QT和VS写了一个图书管理系统的大作业,本学期要求用C++写一个电商平台,于是我重操旧业又开始搞起QT+VS,由于这次老师没限制数据库的使用,本着探索求知的精神,我开始了我的踩坑之旅。第一大敌的就是中文编码问题,回想起上学期的惨痛经历,我决定把QT,C++,MySQL三者之间的中文编码问题整理一下。由于水平有限,只整理做法,不阐述原理,因为我也是一知半解,就不误人子弟
QT与C++之间的中文编码
中文常量在QT和C++中的使用
QString qstr = QString::fromWCharArray(L"我是中国人"); string str = QString::fromWCharArray(L"我是中国人").toStdString();
从QT用户界面中获取中文
//nameLine 为QLineEdit类型 QString qstr = nameLine.text(); string str = nameLine.text().toStdString();
C++与MySQL之间的中文编码
首先初始化数据库和数据结构#include <mysql.h> MYSQL my_sqldata; if (0 == mysql_library_init(0, NULL, NULL)) { cout << "mysql_library_init() succeed" << endl; } else { cout << "mysql_library_init() failed" << endl; } if (NULL != mysql_init(&my_sqldata)) { cout << "mysql_init() succeed" << endl; } else { cout << "mysql_init() failed" << endl; }
重点来啦,需要在连接数据库之前进行预设字符集
if (0 == mysql_options(&my_sqldata, MYSQL_SET_CHARSET_NAME, "gbk")) { cout << "mysql_options() succeed" << endl; } else { cout << "mysql_options() failed" << endl; }
之后利用mysql_real_connect() 函数连接数据库这里省略,下面写入数据库
string sqlstr =//这里的MySQL语句请自行修改数据表名和表项 "INSERT INTO banks(name) VALUES (\"中国建设银行\");"; if (0 == mysql_query(&my_sqldata, sqlstr.c_str())) { cout << "mysql_query() insert data succeed" << endl; } else { cout << "mysql_query() insert data failed" << endl; mysql_close(&my_sqldata); }
写入后,读取并在C++命令行打印
if (0 == mysql_query(&my_sqldata, sqlstr.c_str())) { cout << "mysql_query() select data succeed" << endl; //一次性取得数据集 MYSQL_RES *result = mysql_store_result(&my_sqldata); //获取行数 int row_count = mysql_num_rows(result); //获取各行信息 MYSQL_ROW row = NULL; row = mysql_fetch_row(result); while (NULL != row) { cout << row[0] << endl;//本例中只有一个表项 row = mysql_fetch_row(result); } } else { cout << "mysql_query() select data failed" << endl; mysql_close(&my_sqldata); }
运行代码后,结果展示,感人的中文!!!
QT与MySQL之间的中文编码
我们知道QT有自己的方法与MySQL建立连接,但由于我只是把QT当做了图形化工具使用,因此这里所谓的QT与MySQL之间的中文编码是以C++为媒介的我们首先做个实验,按照上面的步骤将C++从MySQL中获取的中文转换为QString输出到用户界面上
QComboBox *bank_combobox = new QComboBox;//建立一个选择银行的复选框 vector<string> banks = getBanks(my_sqldata);//从数据库获取银行名称 for (int count =0;count<banks.size();count++) { std::cout << banks[count]<<endl; bank_combobox->insertItem(count, QString::fromStdString(banks[count])); }
我们忧伤的发现了乱码
肿么办?我们只需要回到预设字符集处,将使用的编码改为UTF8
if (0 == mysql_options(&my_sqldata, MYSQL_SET_CHARSET_NAME, "UTF8")) { cout << "mysql_options() succeed" << endl; } else { cout << "mysql_options() failed" << endl; }
感人的事情发生了!
几点声明
1.对于连接了MySQL之后的两种情况,既然改变了编码方式,可想而知,黑框界面和图形界面的中文是“势不两立”的,这也是这种简单方法的bug所在2.我也是小白一个,更是第一次写博客,在解决问题的过程中经过多方搜索尝试,整理出来这套方法,所以文中多数代码是直接修改了查到的资料中的代码拿过来用的
3.主要参考:VS2015连接mySQL数据库
相关文章推荐
- 关于解决Mysql中文乱码问题处理,Windows\Linux\Unix
- 简单解决Windows中MySQL的中文乱码与服务启动问题
- 《1---关于解决MySQL在控制台插入中文乱码问题》
- 在windows下的qt5.7.1 的纯C或C++项目命令行中文乱码、无法编译等问题解决
- 简单解决php+mysql时mysql数据表中的中文乱码问题
- 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
- 简单解决Windows中MySQL的中文乱码与服务启动问题
- 关于servlet向mysql添加数据时中文乱码问题的解决
- 关于Mysql中文乱码问题该如何解决
- 关于mysql中文乱码问题的解决方法
- 关于在MySQL 、 VC、 JSP 中使用UTF-8解决中文生僻字乱码的问题
- 关于c++与java中文乱码问题分析与解决
- 文《关于c++与java中文乱码问题分析与解决》中一个bug分析
- 关于Cocos C++ http 有中文参数 服务器接收乱码问题解决!
- 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
- 关于mysql中文乱码问题的解决
- 简单解决php编程当中mysql插入中文乱码问题
- 关于Struts2使用redirectAction方式在两个Action之间传值时中文乱码问题的解决方法
- 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)
- 如何解决页面之间传输中文乱码的问题