sqlite中文乱码问题原因分析及解决_SQLite

在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<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 转为 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 转 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<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 转 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 转 Utf8
string ASCII2UTF_8(string& strAsciiCode)
{
string strRet("");
//先把 ascii 转为 unicode
wstring wstr = Acsi2WideByte(strAsciiCode);
//最后把 unicode 转为 utf8
strRet = Unicode2Utf8(wstr);
return strRet;
}

时间: 2024-09-24 01:11:59

sqlite中文乱码问题原因分析及解决_SQLite的相关文章

数据库管理-关于eclipse中将数据导入数据库的中文乱码问题。急求解决

问题描述 关于eclipse中将数据导入数据库的中文乱码问题.急求解决 我也在网上找过相关问题,在eclipse中也改了三个地方的字符编码,以及数据库管理软件中的编码.但是提交到数据库后 ,还是有乱码,全部都是问号,图如下:开发">计算机数据库管理"> 以及代码: <%@page import="java.sql.DriverManager"%> <%@page import="java.sql.PreparedStateme

引起网站被降权的四点原因分析及解决方法

网站被降权,是仅次于网站被K的比较严重的事情,如果网站被降权了,在百度domain网站域名不在首位,关键词排名下降.相信这个判断方法大家都知道,我就不废话了,直接奔今天的话题,引起网站被降权的四点原因分析及解决办法: 一 .服务器不稳定或打开太慢造成的.服务器不稳定,导致网站总是打不开.买服务器,一要看速度,而要看稳定性,做国内的最好买国内的服务器,国外的服务器普遍没有国内的服务器访问速度快,有的人嫌备案麻烦,就用国外的服务器,其实如果不是快速备案,走正常的备案流程,网站内容不违法,网站的备案不

win7蓝屏的原因分析及解决方法

蓝屏很多时候都是突然发生的,大多数是发生在你玩游戏的时候.很多时候是由于CPU一下子处理不过来,或者电脑脑脾气了.像中毒.中木马之类的蓝屏现在已经很好很好了,当然除非你的电脑是裸机,这才有可能. 1 如果是在玩游戏或者电脑弄很多东西的时候,蓝屏而且只有一.两次,当然你如果下次还开那么多东西,那么肯定是再次蓝屏了. 一般情况下都是由于CPU超频,或者内存不足,你可以买条大的内存装上去,基本上就没问题了.也有的时候是你电脑太热了导致CPU一直超频,然后蓝屏了. 2 有的时候也有可能是一些软件的不兼容

电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法

  电脑中无法打开网页并提示堆栈溢出的原因分析及解决方法 1.函数调用层次过深,每调用一次,函数的参数.局部变量等信息就压一次栈; 2.局部静态变量体积太大. 解决方法: 1.按win+r打开运行,输入cmd,并按回车; 2.打开命令提示符后,分别输入并执行以下命令: regsvr32 atl.dll regsvr32 shdocvw.dll regsvr32 urlmon.dll regsvr32 browseui.dll regsvr32 oleaut32.dll regsvr32 shel

Win7蓝牙驱动安装失败的原因分析与解决方法

  蓝牙是一种支持设备短距离通信的无线电技术,现在不管是手机还是电脑都已经普遍的使用蓝牙功能了.如果Win7系统电脑没有安装蓝牙驱动的话,是需要安装后才能使用的.最近,有用户在安装蓝牙驱动的时候,发现安装失败.怎么办?出现这样的问题要怎么解决?现在就和大家说一下Win7蓝牙驱动安装失败的原因分析与解决方法. 步骤如下: 一.原因分析: 优化软件将系统INF文件夹自带文件误删了. 二.解决方法: 1.进入C盘系统分区的Windowsinf目录,查看是否有"bth.inf"文件,备注:如果

笔记本电脑电源灯不亮/一直闪烁的原因分析及解决方法

笔记本电脑电源灯不亮/一直闪烁的原因分析及解决方法          一.电源灯不亮 首先说说笔记本电源灯不亮,有两种情形: 对于笔记本外部电源(适配器)上的指示灯不亮,那么可能是适配器没有连接到插座,或者插座处没有电,也有可能是适配器坏了. 如果是笔记本上的电源指示灯不亮,那么则可能是: 1.检查外接适配器是否与笔记本正确连接,外接适配器是否工作正常; 2.如果只用电池为电源,检查电池型号是否为原配电池.电池是否充满电.电池安装的是否正确等; 3.排除前面两种情况后,则可能是笔记本主板电源模块

注册表被修改的原因分析和解决方法

注册表被修改的原因分析和解决方法: 其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的注册表被恶意更改的结果. 1.IE默认连接首页被修改 IE浏览器上方的标题栏被改成"欢迎访问******网站"的样式,这是最常见的篡改手段,受害者众多. 受到更改的注册表项目为: HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMainStart Page HKEY_CURRENT_USERSoftwareM

装系统提示:invalid switch fmount原因分析和解决方法

我发现很多人在装系统的时候,遇到提示"invalid switch fmount",就没有办法解决了.在这边我会跟大家分析下出现这个问题的原因和解决方法. 1 装系统提示:invalid switch fmount原因 invalid switch fmount的意思是:你在操作时的命令无效.会产生这个问题的原因是 1:你下载的系统本身就存在问题 2:你电脑存在点问题,没办法进行格式化分区 3:你要装的是双系统,但是2个系统其中有一个不是ghost系统也会导致这样的问题. 2 刚刚遇到

U盘插到电脑上不显示图标的原因分析和解决方法

U盘现在已经是人手必备的工具了,但是好像也不能这样说了,因为现在手机很多时候就是一个移动U盘.但是很多时候U盘插到电脑上不管计算机还是右下角小图标都没显示U盘,这就让我们很郁闷了.下面小编跟你分享下解决这些问题的方法吧! 1 使用量产工具造成的没图标 解决方法:解决的方法是在安国的量产工具中就有一个卸载的小工具,点击"卸载". 2 看下是不是系统问题 在其他电脑看下U盘能不能使用,如果能使用那么就是系统问题了,基本上要靠重装才能解决了.这问题小编还没想到哪里出错. 3 U盘驱动有问题