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



相关阅读:
Yii2分页的使用及其扩展方法详解
浅谈three.js中的needsUpdate的应用
基于Jquery+Ajax+Json实现分页显示附效果图
PHP编写文件多服务器同步程序
在Linux下使用avconv进行屏幕录像的教程
引入autocomplete组件时JS报未结束字符串常量错误
Android实现获取签名及公钥的方法
讲解Java中的基础类库和语言包的使用
IOS如何在Host App 与 App Extension 之间发送通知
java编写贪吃蛇小游戏
Win10桌面屏幕不断忽闪忽现出现闪屏bug该怎么办?
jQuery实现提示密码强度的代码
javascript从右边截取指定字符串的三种实现方法
详解ASP.NET中Session的用法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 绥化-虎林 包头东-广州 甘谷-柳园 海口-菏泽 沟帮子-凌源 青堆-皮口 武夷山北-济南西 拉哈-成高子 溆浦-益阳 沭阳-德州 靖边-上海南 左岭-黄冈西 民权-武昌 盖州-朝阳镇 龙镇-哈尔滨东 蔡家坡-滕州 湘潭-黎塘 乐武-瓦祖 哈密-桑根达来 马鞍山-湘潭 锦州-通辽 黑水-阿尔山 贵定-凯里西 贺日斯台-宝木吐 岱岳-唐山 辽中-北京南 宝林-林口 苏州-武昌 亳州-柳州 石林-新安 安顺-迤那 重庆北-赤壁 南京-镇江 龙川-阳春 通辽-贲红 民族-丰镇 重庆北-垫江 济南-上海南 徐州-咸宁 集宁南-四道湾 成都东-绥德 平凉南-七营 徐水-平顶山 竹园坝-滁州北 界首市-驻马店 定州-涿州 陇西-信阳 大庆东-柴河 深圳-内乡 宣城-武山 永济北-石家庄 察素齐-呼和浩特东 成都-南充北 葛店南-襄阳 兖州-牡丹江 兴平-开封 肇东-龙江 来宾北-武汉 常州-聊城 长沙-陆川 阜新南-上园 南通-丰城 东乡-湘乡 盐池-安康 株洲-汕头 商洛-宝鸡 来宾-内江 吕梁-定边 晏城-文水 大庆西-乾安 信阳-海石湾 德清-句容西 淄博-丹阳北 扶余-中兴 兴城-六盘水 二龙山屯-富裕 山海关-沟帮子 舍力虎-天义 黄州-福州 兑镇-孝南 从山东济宁到宁夏中宁坐火车列车要几次票价与时间呢
想知道: 安康市 从解放路到香溪洞风景区怎么坐公交
从广州去广西横县百合镇怎样坐车的
鞍山到北京的大客在北京什么地方停车
福州到永泰的客车汽车时刻表谁知道啊`
从桂林到福州的客车/火车价钱各是多少.个需要多长时间到达.
请问从贵阳市乘列车火车往武汉,是在贵阳站还是贵阳南站上列车火车呢
上海站到淮海中路怎麽走
我想十一前从长春到兴城去玩
请问朋友,如果从河南永城出发到海南三亚该怎么乘车(列车火车飞
广州汽修美容学校
某地房价逐年上涨,到2007年,房价已经变成2005年的2.25倍,
我要从武汉到宁波,怎么走最方便汽车还是列车火车好呢谢谢
汽车站到滨州利民扶贫医院怎么去
你好 我想从西安到黎平 该怎么坐车最近 真心向你说声谢谢
月姬格斗白莲必杀
想知道: 泉州市石狮从祥芝镇大堡工业区到石狮市子芳路征达广
2005年海口市毕业考试卷
请问:深圳到成都机票 9月底最多能打几拆
邯郸列车火车站电话是多少
贵阳公交车203起点时间,早上6,30我在党校能坐上去列车火车站的车
男孩、女孩子起名各一个,前两个字肖方 后一个取啥好?帮帮忙
急求从凯里到镇远的列车火车发车时间``懂的朋友帮个忙 在线等
十陵车站到四川电力学院温江校区路线
岳阳到三亚坐客车要多久
2月14日在宜兴长途汽车站能否买到当天下午去南通的车票,买到
成都郫县客运中心到双流金花镇怎么坐车?
从广元火车列车站到赛格电脑城什么车
从重庆北站(列车火车站)到重庆邮电大学坐的士要多少钱 新生去
成都到眉山23点后有车吗火车列车和汽车都可以

Copyright © 2016 phpStudy |