後端開發過程遇到的問題總結(1)
在對數據庫信息進行存取時遇到了亂碼問題,起初以爲是數據庫端問題,嘗試和上次一樣對數據庫字符集進行初始化操作,結果沒有解決,又想到講編譯器設置爲多字符集結果仍未解決問題,最後想到在本地進行轉碼。
select到的res含有中文時:
-
由於數據庫是utf8格式,因此要將utf8轉換爲unicode字符集。
-
由於得到的結果是wstring類型,因此再將其轉化爲string類型。
向數據庫傳遞中文:
- update含有中文時先設置gbk即可。
- 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);