您的位置:首页 > 编程语言 > C语言/C++

关于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数据库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息