一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sqlite - sqlite中文亂碼問題原因分析及解決

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

2020-06-04 16:17sqlite教程網 Sqlite

打開數據庫,插入,查詢數據庫等,如果操作接口輸入參數包含中文字符,會導致操作異常,這是由于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;
}

延伸 · 閱讀

精彩推薦
  • SqliteSQLite 錯誤碼整理

    SQLite 錯誤碼整理

    這篇文章主要介紹了SQLite 錯誤碼,方便大家在開發過程中快速解決問題 ...

    SQLite教程網5532020-06-06
  • SqliteSQLite 內存數據庫學習手冊

    SQLite 內存數據庫學習手冊

    這篇文章主要介紹SQLite 內存數據庫的使用方法, 需要的朋友可以參考下 ...

    SQLite教程網3292020-06-06
  • Sqlite詳解SQLite中的查詢規劃器

    詳解SQLite中的查詢規劃器

    這篇文章主要介紹了詳解SQLite中的查詢規劃器,SQLite是一個開源的嵌入式數據庫,需要的朋友可以參考下...

    SQLite教程網8892021-10-25
  • Sqlite基于sqlite特殊字符轉義的實現方法

    基于sqlite特殊字符轉義的實現方法

    本篇文章是對sqlite特殊字符轉義的實現方法進行了詳細的分析介紹,需要的朋友參考下 ...

    sqlite數據庫教程網4132020-06-04
  • SqliteSQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結尾,我提到了SQLite的約束, 但是在那里我把它翻譯成了限定符,不太準確,這里先更正一下,應該翻譯成約束更貼切一點。 那么什么是...

    SQLite入門教程4572020-06-05
  • SqliteSQLite中的WAL機制詳細介紹

    SQLite中的WAL機制詳細介紹

    這篇文章主要介紹了SQLite中的WAL機制詳細介紹,本文講解了什么是WAL、WAL如何工作、WAL的優點與缺點、WAL引入的兼容性問題、WAL引入的性能問題等內容,需要...

    dodo83402020-06-08
  • SqliteSQLite速度評測代碼

    SQLite速度評測代碼

    SQLite 作為一個輕量級嵌入式數據庫,還是非常好用的。雨痕極力推薦~~~~~~ ...

    SQLite教程網5832020-06-01
  • SqliteSQLite中重置自動編號列的方法

    SQLite中重置自動編號列的方法

    這篇文章主要介紹了SQLite中重置自動編號列的方法,本文講解了3種情況和其對應解決方法,需要的朋友可以參考下 ...

    dodo84492020-06-08
主站蜘蛛池模板: 国产精品酒店视频免费看 | 国产精品久久久久久久久免费hd | 欧美一区二区三区四区在线观看 | 东北美女野外bbwbbw免费 | 国产在线成人a | 波多野结衣在线中文字幕 | 青草久久伊人 | 成人私人影院在线观看网址 | 小鸟酱视频在线观看 | 青青色在线观看 | 美女脱小内内给男生摸j | 舔逼| 欧美老肥妇bbbw | 国产精品成人一区二区1 | 91最新国产| 日本高清免费中文字幕不卡 | 婷婷精品 | 午夜福利在线观看6080 | 色老板在线观看 | julianann在厨房 | 久久综合香蕉久久久久久久 | 护士的小嫩嫩好紧好舒服 | 美女国内精品自产拍在线播放 | 午夜国产在线视频 | 调教女高中生第3部分 | x8x8在线观看| 精品久久久久久国产91 | 2022最新a精品视频在线观看 | 国产香蕉视频在线观看 | 国产91对白在线观看 | 国产精品99在线观看 | 热99re久久精品国产 | 我被黄总征服的全过程 | 91se精品免费观看 | 97影院秋霞国产精品 | 亚洲欧美在线观看首页 | 色综合色狠狠天天综合色 | 故意短裙公车被强好爽在线播放 | 欧美色阁 | 国产精品日本亚洲777 | 白丝爆动漫羞羞动漫软件 |