国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQLite > 正文

sqlite中文亂碼問題原因分析及解決

2020-01-25 19:30:16
字體:
來源:轉載
供稿:網友
打開數據庫,插入,查詢數據庫等,如果操作接口輸入參數包含中文字符,會導致操作異常,這是由于sqlite數據庫使用的是UTF-8編碼方式
 
 
在VC++中通過sqlite3.dll接口對sqlite數據庫進行操作,包括打開數據庫,插入,查詢數據庫等,如果操作接口輸入參數包含中文字符,會導致操作異常。例如調用sqlite3_open打開數據庫文件,如果文件路徑出現中文,就會導致打開失敗。sqlite3_exec執行sql語句,如果包含中文對應字符就會變成亂碼。

這是由于sqlite數據庫使用的是UTF-8編碼方式,而傳入的字符串是ASCII編碼或Unicode編碼,導致字符串格式錯誤。解決方案是在調用sqlite接口之前,先將字符串轉換成UTF-8編碼,以下提供各種字符串編碼轉換函數。
復制代碼代碼如下:

//UTF-8轉Unicode 
std::wstring Utf82Unicode(const std::string& utf8string) 

int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, NULL, 0); 
if (widesize == ERROR_NO_UNICODE_TRANSLATION) 

throw std::exception("Invalid UTF-8 sequence."); 

if (widesize == 0) 

throw std::exception("Error in conversion."); 

std::vector<wchar_t> resultstring(widesize); 
int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8string.c_str(), -1, &resultstring[0], widesize); 
if (convresult != widesize) 

throw std::exception("La falla!"); 

return std::wstring(&resultstring[0]); 

//unicode 轉為 ascii 
string WideByte2Acsi(wstring& wstrcode) 

int asciisize = ::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, NULL, 0, NULL, NULL); 
if (asciisize == ERROR_NO_UNICODE_TRANSLATION) 

throw std::exception("Invalid UTF-8 sequence."); 

if (asciisize == 0) 

throw std::exception("Error in conversion."); 

std::vector<char> resultstring(asciisize); 
int convresult =::WideCharToMultiByte(CP_OEMCP, 0, wstrcode.c_str(), -1, &resultstring[0], asciisize, NULL, NULL); 
if (convresult != asciisize) 

throw std::exception("La falla!"); 

return std::string(&resultstring[0]); 

//utf-8 轉 ascii 
string UTF_82ASCII(string& strUtf8Code) 

string strRet(""); 
//先把 utf8 轉為 unicode 
wstring wstr = Utf82Unicode(strUtf8Code); 
//最后把 unicode 轉為 ascii 
strRet = WideByte2Acsi(wstr); 
return strRet; 

/////////////////////////////////////////////////////////////////////// 
//ascii 轉 Unicode 
wstring Acsi2WideByte(string& strascii) 

int widesize = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, NULL, 0); 
if (widesize == ERROR_NO_UNICODE_TRANSLATION) 

throw std::exception("Invalid UTF-8 sequence."); 

if (widesize == 0) 

throw std::exception("Error in conversion."); 

std::vector<wchar_t> resultstring(widesize); 
int convresult = MultiByteToWideChar (CP_ACP, 0, (char*)strascii.c_str(), -1, &resultstring[0], widesize); 
if (convresult != widesize) 

throw std::exception("La falla!"); 

return std::wstring(&resultstring[0]); 

//Unicode 轉 Utf8 
std::string Unicode2Utf8(const std::wstring& widestring) 

int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, NULL, 0, NULL, NULL); 
if (utf8size == 0) 

throw std::exception("Error in conversion."); 

std::vector<char> resultstring(utf8size); 
int convresult = ::WideCharToMultiByte(CP_UTF8, 0, widestring.c_str(), -1, &resultstring[0], utf8size, NULL, NULL); 
if (convresult != utf8size) 

throw std::exception("La falla!"); 

return std::string(&resultstring[0]); 

//ascii 轉 Utf8 
string ASCII2UTF_8(string& strAsciiCode) 

string strRet(""); 
//先把 ascii 轉為 unicode 
wstring wstr = Acsi2WideByte(strAsciiCode); 
//最后把 unicode 轉為 utf8 
strRet = Unicode2Utf8(wstr); 
return strRet; 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 封丘县| 乌兰县| 会理县| 龙川县| 海林市| 珲春市| 历史| 文化| 南靖县| 浪卡子县| 高台县| 饶河县| 鄱阳县| 陆河县| 姚安县| 澄城县| 和硕县| 阿克陶县| 西昌市| 依兰县| 杭锦后旗| 盈江县| 威远县| 灵山县| 肇源县| 京山县| 灌南县| 万宁市| 金秀| 天镇县| 娄底市| 乌鲁木齐县| 陆川县| 德安县| 廉江市| 佳木斯市| 新乐市| 建瓯市| 星子县| 凤冈县| 天祝|