sqlite中文乱码问题解决方案

前端之家收集整理的这篇文章主要介绍了sqlite中文乱码问题解决方案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在VC++中通过sqlite3.dll接口对sqlite数据库进行操作,包括打开数据库,插入,查询数据库等,如果操作接口输入参数包含中文字符,会导致操作异常。例如调用sqlite3_open打开数据库文件,如果文件路径出现中文,就会导致打开失败。sqlite3_exec执行sql语句,如果包含中文对应字符就会变成乱码。这是由于sqlite数据库使用的是UTF-8编码方式,而传入的字符串是ASCII编码或Unicode编码,导致字符串格式错误解决方案是在调用sqlite接口之前,先将字符串转换成UTF-8编码,以下提供各种字符串编码转换函数

  1. //UTF-8转Unicode
  2. std::wstringUtf82Unicode(conststd::string&utf8string)
  3. {
  4. intwidesize=::MultiByteToWideChar(CP_UTF8,utf8string.c_str(),-1,NULL,0);
  5. if(widesize==ERROR_NO_UNICODE_TRANSLATION)
  6. {
  7. throwstd::exception("InvalidUTF-8sequence.");
  8. }
  9. if(widesize==0)
  10. throwstd::exception("Errorinconversion.");
  11. std::vector<wchar_t>resultstring(widesize);
  12. intconvresult=::MultiByteToWideChar(CP_UTF8,&resultstring[0],widesize);
  13. if(convresult!=widesize)
  14. throwstd::exception("Lafalla!");
  15. }
  16. returnstd::wstring(&resultstring[0]);
  17. //unicode转为ascii
  18. stringWideByte2Acsi(wstring&wstrcode)
  19. intasciisize=::WideCharToMultiByte(CP_OEMCP,wstrcode.c_str(),NULL);
  20. if(asciisize==ERROR_NO_UNICODE_TRANSLATION)
  21. if(asciisize==0)
  22. std::vector<char>resultstring(asciisize);
  23. intconvresult=::WideCharToMultiByte(CP_OEMCP,asciisize,153); background-color:inherit; font-weight:bold">if(convresult!=asciisize)
  24. returnstd::string(&resultstring[0]);
  25. //utf-8转ascii
  26. stringUTF_82ASCII(string&strUtf8Code)
  27. stringstrRet("");
  28. //先把utf8转为unicode
  29. wstringwstr=Utf82Unicode(strUtf8Code);
  30. //最后把unicode转为ascii
  31. strRet=WideByte2Acsi(wstr);
  32. returnstrRet;
  33. ///////////////////////////////////////////////////////////////////////
  34. //ascii转Unicode
  35. wstringAcsi2WideByte(string&strascii)
  36. intwidesize=MultiByteToWideChar(CP_ACP,(char*)strascii.c_str(),0);
  37. if(widesize==ERROR_NO_UNICODE_TRANSLATION)
  38. throwstd::exception("InvalidUTF-8sequence.");
  39. if(widesize==0)
  40. throwstd::exception("Errorinconversion.");
  41. intconvresult=MultiByteToWideChar(CP_ACP,widesize);
  42. if(convresult!=widesize)
  43. throwstd::exception("Lafalla!");
  44. returnstd::wstring(&resultstring[0]);
  45. //Unicode转Utf8
  46. std::stringUnicode2Utf8(conststd::wstring&widestring)
  47. intutf8size=::WideCharToMultiByte(CP_UTF8,widestring.c_str(),NULL);
  48. if(utf8size==0)
  49. char>resultstring(utf8size);
  50. intconvresult=::WideCharToMultiByte(CP_UTF8,utf8size,153); background-color:inherit; font-weight:bold">if(convresult!=utf8size)
  51. returnstd::string(&resultstring[0]);
  52. //ascii转Utf8
  53. stringASCII2UTF_8(string&strAsciiCode)
  54. stringstrRet("");
  55. //先把ascii转为unicode
  56. wstringwstr=Acsi2WideByte(strAsciiCode);
  57. //最后把unicode转为utf8
  58. strRet=Unicode2Utf8(wstr);
  59. }
原文链接:https://www.f2er.com/sqlite/200652.html

猜你在找的Sqlite相关文章