Linux下sqlite3乱码,sqlite中文乱码问题原因分析及解决

本文介绍了在VC++中使用sqlite3.dll遇到中文字符问题的解决方案,涉及字符串编码转换函数,如UTF-8到Unicode、Unicode到ASCII,以及如何确保在数据库操作中正确处理中文路径和SQL语句。
摘要由CSDN通过智能技术生成

在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 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 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 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 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;

}

sqlite循环批量插入数据采用批处理文件实现

需要在sqlite数据库中插入大量测试数据,打算用事务进行循环插入操作,不过sqlite不支持declare变量定义,所以无法通过定义循环变量值来实现。需要通

基于sqlite特殊字符转义的实现方法

select*fromtablewherenumberlike'%/%%'escape'/'...sqlite3数据库在搜索的时候,一些特殊的字符需要进行转义,具体的转义如下:/-//'-''[-/[]-/]%-/%&-/&_-/_(-/()-/)需要注

Linux sqlite3 基本命令

备注:本文所有操作均在root用户下进行。1、安装sqlite3ubuntu下安装sqlite3直接在终端运行命令:#apt-getinstallsqlite3查看版本信息:#sqlite3-version2、sqlite3常用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值