解決基於JDBC下C++連接MySQL存取中文亂碼問題

                                       後端開發過程遇到的問題總結(1)

在對數據庫信息進行存取時遇到了亂碼問題,起初以爲是數據庫端問題,嘗試和上次一樣對數據庫字符集進行初始化操作,結果沒有解決,又想到講編譯器設置爲多字符集結果仍未解決問題,最後想到在本地進行轉碼。

select到的res含有中文時:

  1. 由於數據庫是utf8格式,因此要將utf8轉換爲unicode字符集。

  2. 由於得到的結果是wstring類型,因此再將其轉化爲string類型。

       向數據庫傳遞中文:

  1. update含有中文時先設置gbk即可。
  2. select語句含有中文時將unicode轉utf8即可,原理同上。

代碼如下:

// wstring轉string
string WstringToString(const wstring str) {
	unsigned len = str.size() * 4;
	setlocale(LC_CTYPE, "");
	char* p = new char[len];
	wcstombs(p, str.c_str(), len);
	string str1(p);
	delete[] p;
	return str1;
}

// utf8轉unicode
wstring UTF8ToUnicode(const string& str) {
	wstring_convert<codecvt_utf8<wchar_t>> utf8_cvt;
	return utf8_cvt.from_bytes(str);
}

// string轉wstring
wstring StringToWstring(const string str) {
	unsigned len = str.size() * 2;    // 預留字節數
	setlocale(LC_CTYPE, "");          //必須調用此函數
	wchar_t* p = new wchar_t[len];    // 申請一段內存存放轉換後的字符串
	mbstowcs(p, str.c_str(), len);    // 轉換
	wstring str1(p);				  
	delete[] p;                       // 釋放申請的內存
	return str1;
}

// unicode轉utf8
string UnicodeToUTF8(const wstring& wstr) {
	wstring_convert< codecvt_utf8<wchar_t> > wcv;
	return wcv.to_bytes(wstr);
}

使用方法:

//res含有中文時
string bookname = WstringToString(UTF8ToUnicode(res->getString("book_name")));

//select語句含有中文時
string sql = "select * from ...";
sql = UnicodeToUTF8(StringToWstring(sss));

//update語句含有中文時,先執行以下語句
string sql = "set names 'gbk';";
int i = up.Update(sql);

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章