在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常用

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

  1. 解决Windows下Arm下Linux下Qt4程序的中文乱码问题

    解决Windows下Arm下Linux下Qt4程序的中文乱码问题 ################################################################### ...

  2. Linux下Birt、JTreeChart中文乱码问题解决办法

    Linux下JTreeChart,Birt等报表工具显示中文乱码解决 1) 现象: 在Windows上生成的报表图片展示正常,但是在Linux上显示(怪异的小方块"口"): 2)问 ...

  3. JFreechart 在linux下不显示及中文乱码问题

    一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库 ...

  4. Linux下oracle显示问号,Linux下oracle插入(导入)中文记录显示为问号问题及解决办法...

    字符集 oracle官方关于字符集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20 ...

  5. (GPS移植三部曲)Linux下移植GPS应用程序之常见问题的分析与解决方法之三

    GPS应用程序移植常见问题分析与解决 ID Issue Description Analyse Causation Solution 1 导航系统一运行,就退出 使用ps命令,发现进程中cld_nav ...

  6. linux then命令不识别,Linux终端提示符(prompt)不如期生效的原因分析与解决

    前言 在开始本文的内容之前,我们先来简单介绍下, prompt是什么鬼? 顾名思义就是提示符的意思, 看起来和我们遥远, 但实际上只要是每个接触shell的童鞋, 都有看到, 那就是我们在输命令时前面 ...

  7. linux下batik-rasterizer.jar生成图片中文乱码

    为什么80%的码农都做不了架构师?>>>    发现原来jdk5.0在linux下和以前的版本还不一样,默认不支持中文字体的.得手动去搞一个fontconfig配置, 此文件在$JA ...

  8. linux wine 中文乱码,Linux下使用Wine出现中文乱码的解决方法

    准备工作 使用wine打开福昕阅读器FoxitReader(或者通过其他方法打开wine),然后点击"打开PDF文件"(为什么要这样做呢?因为这样子可以看到ubuntu的虚拟C盘) ...

  9. 使用 免费可商用的中文字体 解决CentOS Linux下Java生成图片水印中文乱码问题

    安装开源可商用的google-noto字体 [root@dev ~]# yum install google-noto-cjk-fonts Loaded plugins: fastestmirror ...

最新文章

  1. 【IM】关于参数模型和核模型的理解
  2. 一个系统的base.css,兼容IE7,IE8,IE9,IE10,IE11,firefox,safari,谷歌,360,世界之窗等浏览器起的公共css
  3. 深度探索linux系统虚拟化 原理与实现,深度探索Linux系统虚拟化:原理与实现
  4. 华为服务器故障灯不开机_华为服务器日常维护及故障处理介绍V.ppt
  5. An invalid form control with name='timeone[]' is not focusable.
  6. linux crontab 怎么用,Linux crontab 如何使用
  7. 什么是正则表达式?有什么用?常用的字符有哪些?
  8. C++ 全局变量 静态变量 全局函数 静态函数
  9. vue ---- 组件综合案例(购物车案例)
  10. PHP新的连接MySQL方法mysqli
  11. 程序员才懂的 1 首歌和 6 张图
  12. define语句换行\后不能有空格
  13. 远程连接redis,并设置字符集
  14. 西门子PLC S7 200 SMART 没有触摸屏的仿真
  15. 内与外的困惑:找出System进程占用100%CPU的元凶
  16. 【Alpha版本】冲刺阶段——Day 1
  17. linux无线网卡创建ap,Linux中使用hostapd创建无线AP及相关问题的处理方法
  18. 直播互动软件神器有哪些
  19. 给女朋友的微信专属推送
  20. 基于Java科研项目申报管理系统

热门文章

  1. 都在抢论文第一作者,怎么解决?
  2. Spark集群搭建【Spark+Hadoop+Scala+Zookeeper】
  3. java中的Executors简介与多线程在网站上逐步优化的运用案例
  4. 06 回归算法 - 损失函数、过拟合欠拟合
  5. 邮件发送退信分析大全/SMTP error, RCPT TO: 550 Relay Deny
  6. 寻找网页设计灵感的200佳网站推荐(系列二)
  7. r语言 col_R语言代码相关疑问标准提问
  8. 方向对了,就能学好Linux
  9. 聊一聊我认识的Linux系统
  10. 51单片机怎么学啊?有推荐的线上网课和书籍么?