1. 程式人生 > >關於QT,C++,MySQL之間中文亂碼問題的簡單解決

關於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資料庫

相關推薦

關於QT,C++,MySQL之間中文亂碼問題的簡單解決

中文編碼之殤 上學期用QT和VS寫了一個圖書管理系統的大作業,本學期要求用C++寫一個電商平臺,於是我重操舊業又開始搞起QT+VS,由於這次老師沒限制資料庫的使用,本著探索求知的精神,我開始了我的踩坑之旅。 第一大敵的就是中文編碼問題,回想起上學期的慘痛

mysql顯示中文亂碼問題解決

text lang cte 中文 解決 rac cli Language mysq SET character_set_client=‘gbk‘; SET character_set_connection=‘gbk‘; SET character_set_resu

SpringBoot JPA MySQL 遇到中文亂碼解決辦法

轉載於:https://blog.csdn.net/sanpic/article/details/79344562 在SpringBoot JPA中使用MySQL時, 資料庫的值為中文亂碼, 需要如下兩個方面的設定,  1. 資料庫的編碼為UTF-8, 或者GB2312 也可以.

centos中mysql資料庫中文亂碼解決方法

預設my.cnf配置檔案中在/etc/mycnf,開啟之後在裡面加入以下命令即可: [client] default-character-set=utf8 [mysqld] character-set-server=utf8 collation-server=u

Linux系統下Mysql資料庫中文亂碼問題解決

問題描述:當我們將開發好的javaWEB專案部署到linux系統上,操作資料庫的時候,會出現中文亂碼問題,比如做插入操作,發現新增到資料庫的資料中文出現論碼,下面就將解決linux下mysql中文亂碼問題! 一.開啟Linux視窗,啟動mysql。 二.連線mysql輸入

Windows中mysql資料庫中文亂碼永久解決方法

在mysql安裝目錄下新增一個my.ini檔案。內容如下:  [client]     port=3306     default-character-set=utf8     [mysqld]     port=3306     character_set_server

Mac下,MySQL資料庫中文亂碼解決方法

在Mac下安裝MySQL資料庫,作為本地資料庫使用。但向資料庫中匯入資料時一直中文亂碼,試了很多方法都沒有解決。終於在熬夜奮戰了近3個小時後,把問題解決了(雖然還是不明白原因細節)。先上圖: 解決方案:匯入時,選擇GBK格式。(總的來講,有點瞎貓碰上死耗子

MySQL中文亂碼問題解決方案

在實現JSP頁面的時候,顯示資料庫上面的列表出現亂碼,解決成功,做個筆記,以後遇到作為參考 第一步 避免建立資料庫及表出現中文亂碼和檢視編碼方法 1.建資料庫的時候就設成utf8 create database db_name character set 'utf8' c

ubuntu mysql emma中文亂碼問題解決

ubuntu mysql  emma中文亂碼問題解決   emma預設用apt-get 安裝的話,emma是不支援中文的,配置檔案或直接修改emma程式原始檔(python)。 apt-get安裝emma sudo apt-get install emma    ubun

ssm框架插入mysql數據庫中文亂碼問題解決

mar word ref def http reat pro xml文件 framework 1. 檢查web.xml <!-- 編碼過濾器 --> <filter> <filter-name>

scrapy爬蟲錄入mysql中文亂碼解決

start roo spa 爬蟲 裏的 記得 navicat item 字符集   scrapy爬取item後,我們可以用pipeline.py把item錄入到mysql數據庫裏   編寫pipeline.py定義一個類,這個類就是用來錄入數據庫的,記得在setting.p

Spring Boot JPA MySQL 入庫MySQL資料庫時中文亂碼解決辦法

問題表述:        上篇部落格中抒寫了Spring Data Jpa實體類自動建立資料庫表失敗解決即原因(踩過的坑),接著在操作JPA插入資料進資料庫時,發現數據庫的值為中文亂碼(??),需要注意一下的配置點,所以記錄一下,希望能幫到大家(#^.^#

解決MySQL匯入中文亂碼

 匯入檔案xxdb.sql 包含資料庫中表結構和資料,charset——utf8mb4 ,collate——utf8mb4_unicode_ci 1. create database xxdb charset utf8mb4 collate utf8mb4_unicode_ci

解決windows下mysql資料庫中文亂碼的問題

今天下午,在Qt中往mysql資料庫中插入資料時,中文顯示亂碼,如下圖所示: 開始以為是資料庫字元編碼的問題,[1]開始使用set character_set_database=utf8 在命令列上修改字元編碼, 但是重啟mysql之後,字元編碼並沒有修改成功。 [2]於是找到My

JSP與servlet之間中文亂碼問題解決

在jsp與servlet之間傳遞中文引數常常遇到,基本常用幾個: 1.以post 方式傳遞 post傳遞的時候在用引數之前加上: request.setCharacterEncoding("UTF

對於mysql資料庫中文亂碼問題的解決(在所有的編碼都是utf-8的情況下中文亂碼

在寫jdbc連結mysqll資料庫時,向其中插入中文資料出現亂碼。查看了所有的配置,都是utf-8編碼,my.ini配置檔案也修改好了,還出現這樣的亂碼,實屬不應該。 在各種部落格論壇查詢,都是修改資料庫的編碼的套路,其中也不乏有在連線資料庫的連結url中加編碼的,比如:“jdbc:mysql:

C語言---VS2017---輸出中文亂碼問題解決方案

 今天會員【HiroLCS】提到一個問題,就是在VS2017新建的C/C++控制檯程式顯示的中文竟然是亂碼,效果圖如下:            出現亂碼,必然是編碼問題。而編碼問題就要考慮到多方面的因素,大致分為:檔案編碼、程式碼編碼、輸出結果顯示的編碼。我們只要以此來檢查這

C++操作MySQL出現中文亂碼問題

*解決方案:* 在連線到資料庫後加上這麼一句 linux環境 mysql_query(connection, “SET NAMES UTF8”); windows環境 mysql_query(

c++中文亂碼解決

c++出現中文亂碼: 1.把編碼格式改為utf-8(codeblocks中為setting->editor->general settings->Encoding(在這裡改)) 2.確保你的工程路徑全是是英文(本人之前就是因為路徑是中文的,怎麼都弄不好亂碼

簡單的node檔案上傳下載及中文亂碼問題解決

1. 基於MEAN的技術棧,使用restful風格的介面2. 在前端程式碼中放置檔案上傳按鈕和處理表單資料<div class="upload-file btn btn-sm btn-primary mb-2"> <span><i class