对SQLite中文混沌编码的原因分析及解决方法

在VC++中,SQLite数据库是通过sqlite3.dll界面操作,包括打开数据库,插入和查询数据库。如果操作界面输入参数包含中文字符,这将导致异常的操作。例如,电话sqlite3_open打开数据库文件,如果文件路径出现在中国,这将导致开放failure.sqlite3_exec执行SQL语句,如果包含中文字符,它将成为一个混乱的代码。

这是因为SQLite数据库使用UTF-8编码,而传入的字符串是ASCII或Unicode编码,造成一个字符串格式错误。解决的办法是将字符串转换为UTF-8在SQLite的接口调用,以下是各种字符串编码转换函数。
复制代码代码如下所示:
/ / UTF-8 Unicode
std::wstring utf82unicode(const std::string utf8string)
{
国际widesize =::MultiByteToWideChar(cp_utf8,0,utf8string.c_str(),1,零,0);
如果(widesize = error_no_unicode_translation)
{
抛出std::例外(无效UTF-8序列。);
}
如果(widesize = 0)
{
抛出异常:转换中的错误;
}
std::vector resultstring(widesize);
国际convresult =::MultiByteToWideChar(cp_utf8,0,utf8string.c_str(),1,resultstring { 0 },widesize);
如果(convresult!= widesize)
{
抛出std::例外(拉法拉!;
}
返回std::wstring(resultstring { 0 });
}
将Unicode转换为ASCII
字符串widebyte2acsi(wstring wstrcode)
{
国际asciisize =::WideCharToMultiByte(cp_oemcp,0,wstrcode.c_str(),1,0,零,零,零);
如果(asciisize = error_no_unicode_translation)
{
抛出std::例外(无效UTF-8序列。);
}
如果(asciisize = 0)
{
抛出异常:转换中的错误;
}
std::vector resultstring(asciisize);
国际convresult =::WideCharToMultiByte(cp_oemcp,0,wstrcode.c_str(),1,resultstring { 0 },asciisize,null,null);
如果(convresult!= asciisize)
{
抛出std::例外(拉法拉!;
}
返回std::string(resultstring { 0 });
}
/ / UTF-8 ASCII
字符串(字符串utf_82ascii strutf8code)
{
strret字符串();
/ /转utf8转换为Unicode的第一
wstring WSTR = utf82unicode(strutf8code);
Unicode到ASCII
strret = widebyte2acsi(WSTR);
返回strret;
}
中有:
/ ASCII到unicode
acsi2widebyte wstring(字符串strascii)
{
国际widesize = MultiByteToWideChar(cp_acp,0,(char *)strascii.c_str(),1,零,0);
如果(widesize = error_no_unicode_translation)
{
抛出std::例外(无效UTF-8序列。);
}
如果(widesize = 0)
{
抛出异常:转换中的错误;
}
std::vector resultstring(widesize);
国际convresult = MultiByteToWideChar(cp_acp,0,(char *)strascii.c_str(),1,resultstring { 0 },widesize);
如果(convresult!= widesize)
{
抛出std::例外(拉法拉!;
}
返回std::wstring(resultstring { 0 });
}
/ / Unicode UTF8
std::string unicode2utf8(const std::wstring widestring)
{
国际utf8size =::WideCharToMultiByte(cp_utf8,0,widestring.c_str(),1,0,零,零,零);
如果(utf8size = 0)
{
抛出异常:转换中的错误;
}
std::vector resultstring(utf8size);
国际convresult =::WideCharToMultiByte(cp_utf8,0,widestring.c_str(),1,resultstring { 0 },utf8size,null,null);
如果(convresult!= utf8size)
{
抛出std::例外(拉法拉!;
}
返回std::string(resultstring { 0 });
}
/ / ASCII为UTF8
字符串(字符串ascii2utf_8 strasciicode)
{
strret字符串();
第一个将ASCII转换为Unicode
wstring WSTR = acsi2widebyte(strasciicode);
Unicode / / UTF8
strret = unicode2utf8(WSTR);
返回strret;
}