主頁 > 知識庫 > sqlite中文亂碼問題原因分析及解決

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

熱門標(biāo)簽:江西穩(wěn)定外呼系統(tǒng)供應(yīng)商 電話機(jī)器人錄音師薪資 高德地圖標(biāo)注電話怎么沒了 智能電銷機(jī)器人教育 北京智能外呼系統(tǒng)供應(yīng)商家 中國地圖標(biāo)注省份用什么符號 無錫梁溪公司怎樣申請400電話 孝感銷售電銷機(jī)器人廠家 奧維地圖標(biāo)注字體大小修改
在VC++中通過sqlite3.dll接口對sqlite數(shù)據(jù)庫進(jìn)行操作,包括打開數(shù)據(jù)庫,插入,查詢數(shù)據(jù)庫等,如果操作接口輸入?yún)?shù)包含中文字符,會導(dǎo)致操作異常。例如調(diào)用sqlite3_open打開數(shù)據(jù)庫文件,如果文件路徑出現(xiàn)中文,就會導(dǎo)致打開失敗。sqlite3_exec執(zhí)行sql語句,如果包含中文對應(yīng)字符就會變成亂碼。

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

//UTF-8轉(zhuǎn)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::vectorwchar_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 轉(zhuǎn)為 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::vectorchar> 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 轉(zhuǎn) ascii
string UTF_82ASCII(string strUtf8Code)
{
string strRet("");
//先把 utf8 轉(zhuǎn)為 unicode
wstring wstr = Utf82Unicode(strUtf8Code);
//最后把 unicode 轉(zhuǎn)為 ascii
strRet = WideByte2Acsi(wstr);
return strRet;
}
///////////////////////////////////////////////////////////////////////
//ascii 轉(zhuǎn) 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::vectorwchar_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 轉(zhuǎn) 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::vectorchar> 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 轉(zhuǎn) Utf8
string ASCII2UTF_8(string strAsciiCode)
{
string strRet("");
//先把 ascii 轉(zhuǎn)為 unicode
wstring wstr = Acsi2WideByte(strAsciiCode);
//最后把 unicode 轉(zhuǎn)為 utf8
strRet = Unicode2Utf8(wstr);
return strRet;
}
您可能感興趣的文章:
  • Android開發(fā)之SQLite的使用方法
  • SQLite 中文指南之FAQ
  • SQLite中的B-Tree實(shí)現(xiàn)細(xì)節(jié)分析
  • SQLite3中的日期時間函數(shù)使用小結(jié)
  • sqlite3 top的查詢及l(fā)imit語法介紹
  • SQLite優(yōu)化方法
  • Sqlite 常用函數(shù) 推薦
  • SQLite 錯誤碼整理
  • sQlite常用語句以及sQlite developer的使用與注冊

標(biāo)簽:那曲 海北 荊州 臨滄 泰州 阜陽 通化 齊齊哈爾

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sqlite中文亂碼問題原因分析及解決》,本文關(guān)鍵詞  sqlite,中文,亂碼,問題,原因分析,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《sqlite中文亂碼問題原因分析及解決》相關(guān)的同類信息!
  • 本頁收集關(guān)于sqlite中文亂碼問題原因分析及解決的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章