麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 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; 
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: www.射| 91在线色 | 福利在线免费视频 | 精品国产一区二区三区久久久 | 成人免费观看在线 | 黑人三级毛片 | 久久久国产视频 | 欧美a在线 | 中文字幕爱爱视频 | 久久草在线看 | 午夜爽爽爽男女免费观看hd | 久国久产久精永久网页 | 国产精品久久久久久238 | 欧洲精品久久 | 日韩视频一二区 | 黄片毛片一级 | 最新se94se在线欧美 | 精品日韩欧美 | 2级毛片 | 黄网站在线观 | 国产羞羞视频在线观看免费应用 | 激情91| 国产精品区一区二区三区 | 国产精品久久久免费 | 理论片中文字幕 | 懂色av懂色aⅴ精彩av | 大学生a级毛片免费视频 | 国产91一区二区三区 | 免费黄色大片在线观看 | 男人久久天堂 | 激情夜色 | 久久国产经典 | 欧美成年人视频在线观看 | 欧美精品久久天天躁 | 国产成人羞羞视频在线 | 成人午夜在线观看视频 | 亚洲网站免费看 | 草逼一区| 日韩视频在线不卡 | 日日操夜| 在线91视频 |