在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常。例如调用sqlite3_open打开数据库文件,如果文件路径出现中文,就会导致打开失败。sqlite3_exec执行sql语句,如果包含中文对应字符就会变成乱码。这是由于sqlite数据库使用的是UTF-8编码方式,而传入的字符串是ASCII编码或Unicode编码,导致字符串格式错误。解决方案是在调用sqlite接口之前,先将字符串转换成UTF-8编码,以下提供各种字符串编码转换函数。
- //UTF-8转Unicode
- std::wstringUtf82Unicode(conststd::string&utf8string)
- {
- intwidesize=::MultiByteToWideChar(CP_UTF8,utf8string.c_str(),-1,NULL,0);
- if(widesize==ERROR_NO_UNICODE_TRANSLATION)
- {
- throwstd::exception("InvalidUTF-8sequence.");
- }
- if(widesize==0)
- throwstd::exception("Errorinconversion.");
- std::vector<wchar_t>resultstring(widesize);
- intconvresult=::MultiByteToWideChar(CP_UTF8,&resultstring[0],widesize);
- if(convresult!=widesize)
- throwstd::exception("Lafalla!");
- }
- returnstd::wstring(&resultstring[0]);
- //unicode转为ascii
- stringWideByte2Acsi(wstring&wstrcode)
- intasciisize=::WideCharToMultiByte(CP_OEMCP,wstrcode.c_str(),NULL);
- if(asciisize==ERROR_NO_UNICODE_TRANSLATION)
- if(asciisize==0)
- std::vector<char>resultstring(asciisize);
- intconvresult=::WideCharToMultiByte(CP_OEMCP,asciisize,153); background-color:inherit; font-weight:bold">if(convresult!=asciisize)
- returnstd::string(&resultstring[0]);
- //utf-8转ascii
- stringUTF_82ASCII(string&strUtf8Code)
- stringstrRet("");
- //先把utf8转为unicode
- wstringwstr=Utf82Unicode(strUtf8Code);
- //最后把unicode转为ascii
- strRet=WideByte2Acsi(wstr);
- returnstrRet;
- ///////////////////////////////////////////////////////////////////////
- //ascii转Unicode
- wstringAcsi2WideByte(string&strascii)
- intwidesize=MultiByteToWideChar(CP_ACP,(char*)strascii.c_str(),0);
- if(widesize==ERROR_NO_UNICODE_TRANSLATION)
- throwstd::exception("InvalidUTF-8sequence.");
- if(widesize==0)
- throwstd::exception("Errorinconversion.");
- intconvresult=MultiByteToWideChar(CP_ACP,widesize);
- if(convresult!=widesize)
- throwstd::exception("Lafalla!");
- returnstd::wstring(&resultstring[0]);
- //Unicode转Utf8
- std::stringUnicode2Utf8(conststd::wstring&widestring)
- intutf8size=::WideCharToMultiByte(CP_UTF8,widestring.c_str(),NULL);
- if(utf8size==0)
- char>resultstring(utf8size);
- intconvresult=::WideCharToMultiByte(CP_UTF8,utf8size,153); background-color:inherit; font-weight:bold">if(convresult!=utf8size)
- returnstd::string(&resultstring[0]);
- //ascii转Utf8
- stringASCII2UTF_8(string&strAsciiCode)
- stringstrRet("");
- //先把ascii转为unicode
- wstringwstr=Acsi2WideByte(strAsciiCode);
- //最后把unicode转为utf8
- strRet=Unicode2Utf8(wstr);
- }