关于QT,C++,MySQL之间中文乱码问题的简单解决

中文编码之殇


上学期用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数据库

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值