欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2013年04月19日 15:53:14   作者:  
打開數(shù)據(jù)庫,插入,查詢數(shù)據(jù)庫等,如果操作接口輸入?yún)?shù)包含中文字符,會(huì)導(dǎo)致操作異常,這是由于sqlite數(shù)據(jù)庫使用的是UTF-8編碼方式
在VC++中通過sqlite3.dll接口對sqlite數(shù)據(jù)庫進(jìn)行操作,包括打開數(shù)據(jù)庫,插入,查詢數(shù)據(jù)庫等,如果操作接口輸入?yún)?shù)包含中文字符,會(huì)導(dǎo)致操作異常。例如調(diào)用sqlite3_open打開數(shù)據(jù)庫文件,如果文件路徑出現(xiàn)中文,就會(huì)導(dǎo)致打開失敗。sqlite3_exec執(zhí)行sql語句,如果包含中文對應(yīng)字符就會(huì)變成亂碼。

這是由于sqlite數(shù)據(jù)庫使用的是UTF-8編碼方式,而傳入的字符串是ASCII編碼或Unicode編碼,導(dǎo)致字符串格式錯(cuò)誤。解決方案是在調(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::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 轉(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::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 轉(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::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 轉(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::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 轉(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;
}

相關(guān)文章

  • SQL中使用ESCAPE定義轉(zhuǎn)義符詳解

    SQL中使用ESCAPE定義轉(zhuǎn)義符詳解

    這篇文章主要介紹了SQL中使用ESCAPE定義轉(zhuǎn)義符的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • SQLite教程(五):索引和數(shù)據(jù)分析/清理

    SQLite教程(五):索引和數(shù)據(jù)分析/清理

    這篇文章主要介紹了SQLite教程(五):索引和數(shù)據(jù)分析/清理,本文講解了創(chuàng)建索引、刪除索引、重建索引、數(shù)據(jù)分析、數(shù)據(jù)清理等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • SQLite3 命令行操作指南

    SQLite3 命令行操作指南

    這篇文章主要為大家介紹了SQLite3 命令行操作的一些幫助,需要的朋友可以參考下
    2013-12-12
  • SQLite教程(十):內(nèi)存數(shù)據(jù)庫和臨時(shí)數(shù)據(jù)庫

    SQLite教程(十):內(nèi)存數(shù)據(jù)庫和臨時(shí)數(shù)據(jù)庫

    這篇文章主要介紹了SQLite教程(十):內(nèi)存數(shù)據(jù)庫和臨時(shí)數(shù)據(jù)庫,本文講解了它們的創(chuàng)建方法和相關(guān)知識,需要的朋友可以參考下
    2015-05-05
  • SQLite字符串比較時(shí)的大小寫問題解決方法

    SQLite字符串比較時(shí)的大小寫問題解決方法

    這篇文章主要介紹了SQLite字符串比較時(shí)的大小寫問題解決方法,本文總結(jié)了比較字符串時(shí)的大小寫問題的3種解決方案,需要的朋友可以參考下
    2015-03-03
  • System.Data.SQLite 數(shù)據(jù)庫詳細(xì)介紹

    System.Data.SQLite 數(shù)據(jù)庫詳細(xì)介紹

    System.Data.SQLite是SQLite的加強(qiáng)版,它可以無需.NET Framework支持,由于它內(nèi)部包含了一個(gè)ADO.NET 2.0引擎,所以.NET開發(fā)人員可以利用System.Data.SQLite方便地開發(fā).NET程序。
    2011-02-02
  • SQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結(jié)尾,我提到了約束, 但是在那里我把它翻譯成了限定符,不太準(zhǔn)確,這里先更正一下,應(yīng)該翻譯成約束更貼切一點(diǎn)。 那么什么是約束呢
    2013-12-12
  • ubuntu下使用SQLite3的基本命令

    ubuntu下使用SQLite3的基本命令

    sqlite3一款主要用于嵌入式的輕量級數(shù)據(jù)庫,本文旨在為熟悉sqlite3基本命令提供技術(shù)文檔。希望對讀者們有所幫助,如有疑問請和我聯(lián)系,盡可能解答
    2014-08-08
  • VScode第三方插件打開sqlite數(shù)據(jù)庫圖文教程

    VScode第三方插件打開sqlite數(shù)據(jù)庫圖文教程

    在實(shí)際做一個(gè)項(xiàng)目的時(shí)候,為了提高效率我們會(huì)首選不重復(fù)造輪子,所以可能會(huì)用到第三方庫,下面這篇文章主要給大家介紹了關(guān)于VScode第三方插件打開sqlite數(shù)據(jù)庫的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • SQLite3中自增主鍵相關(guān)知識總結(jié)

    SQLite3中自增主鍵相關(guān)知識總結(jié)

    這篇文章主要介紹了SQLite3中自增主鍵相關(guān)知識總結(jié),清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以參考下
    2014-05-05

最新評論