C++Builder RAD Studio XE, UTF-8 String 转换为 char * 字符串的最简单方式, 常用于sqlite3开发

iamwolfe 2011-12-04 06:20:29
  前段时间突然使用sqlite3开发,中间需要用中文,XE的缺省char*直接使用中文,在sqlite *.db3的数据库表格中显示是乱码,用数据库管理器来浏览等管理时非常不便。

  于是决定还是使用utf-8的String数据类型,但在sqlite的API中,输入字符串参数均为char*,直接使用String是编译通不过的,在csdn,谷哥,度娘等搜索,不知道是关键字没设置好还是什么,说的都不得要领,后来找到有人会写一段程序,用逐个字符翻译的方式转换,我心不甘,于是试了几天,试出一个更加简便的方式,列出给各位。

我使用的编译器是RAD XE, Sqlite版本3.7.9, 数据库管理器是sqlite expert 3.3.52。

直接使用字符串,由于编译为GBK,导致管理器浏览出来是乱码。

int iRet;
sqlite3 *psqlite3;
char *pQuery, *pErrMsg;
iRet = sqlite3_open( "c:\\test.db3", &psqlite3 );
pQuery = "INSERT INTO table1 (idno,user,pass) VAULES( 1, 'GBK中文', '直接使用char类型' );";
iRet = sqlite3_exec( psqlite3, pQuery, NULL, NULL, &pMsg );
sqlite3_close( psqlite3 );


而当使用String类型,在如下转换后, sqlite expert正常显示中文,表明使用了utf-8编译成功.

int iRet;
sqlite3 *psqlite3;
char *pQuery, *pErrMsg, QueryBuf[512];
String strUtf8;
RawByteString strRaw;

strUtf8 = "INSERT INTO table1 (idno,user,pass) VAULES( 1, 'Utf8中文', '使用String类型再转' );";"
strRaw = UTF8Encode(strUtf8);
strcpy( QueryBuf, strRaw.c_str() );


iRet = sqlite3_open( "c:\\test.db3", &psqlite3 );
iRet = sqlite3_exec( psqlite3, QueryBuf, NULL, NULL, &pMsg );
sqlite3_close( psqlite3 );


测试后看,utf-8格式显示中文成功。

这里的关键是,把String类型utf-8,使用UTF8Encode系统函数,转换成RawByteString,然后使用RawByteString类型的成员函数c_str(),可转换成char*类型,而内容是utf-8格式的,这样在传进sqlite api后,可正常作为utf-8的内容。








...全文
1727 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
anarki1234 2012-11-13
  • 打赏
  • 举报
回复
刚刚看到不过还是实用
Jonix 2012-11-07
  • 打赏
  • 举报
回复
刚看到,是一年前的贴子啊。。。。
Jonix 2012-11-07
  • 打赏
  • 举报
回复
楼主用错sqlite的函数了 sqlite 接口有两套,一套不支持宽字符,第二套支持(函数名中含有16的) 嘿嘿,我吃过药的,导致一批库的数据全废掉了。
我不懂电脑 2012-11-07
  • 打赏
  • 举报
回复
记号,收藏了!
himalayan1 2012-11-06
  • 打赏
  • 举报
回复
ansitoutf8 这个好,收藏
zhuyiweixiao 2012-11-06
  • 打赏
  • 举报
回复
我现在遇到的问题和你们的有点像 ,好像又有点区别,我的编程工具CodeGear RAD Studio 2009,直接用的char*往数据库(sqlite3)插入数据,然后在界面读出来,这期间用中文是没有问题,但是在SQLiteMaestro.exe这个数据库管理工具看中文显示为空.因为把数据写入数据库是调用的dll动态库,所以都是c的代码,没有String类型可用,要怎么办呢?
mhss9301 2012-05-25
  • 打赏
  • 举报
回复
从数据库取出字符串后估计同样要装换, 装换为本地编码
bigfog 2012-04-11
  • 打赏
  • 举报
回复
不错,做个记号
fbmsyu 2012-04-10
  • 打赏
  • 举报
回复
bcb6 表示毫无压力。
小笨象 2011-12-09
  • 打赏
  • 举报
回复
用AnsiString,一样可以。只要把内容使用ansitoutf8函数来转换成utf-8格式的char*就行了。
俺一直这样用。
jssav 2011-12-05
  • 打赏
  • 举报
回复
记号,收藏了!
我来看看CB 2011-12-05
  • 打赏
  • 举报
回复
收藏。。。。。。。。
laowang2 2011-12-05
  • 打赏
  • 举报
回复
嗯,sqlite是utf8编码的
zzbinfo 2011-12-05
  • 打赏
  • 举报
回复
记号,不错
Lewolf 2011-12-05
  • 打赏
  • 举报
回复
用AnsiString行不?
XE中AnsiString和String是不同的吧。
资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 四路20秒声光显示计分抢答器Multisim14仿真源文件+设计文档资料摘要 数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。关键字:开关阵列电路;触发锁存电路;解锁电路;编码电路;显示电路 一、设计目的 本设计是利用已学过的数电知识,设计的4人抢答器。(1)重温自己已学过的数电知识;(2)掌握数字集成电路的设计方法和原理;(3)通过完成该设计任务掌握实际问题的逻辑分析,学会对实际问题进行逻辑状态分配、化简;(4)掌握数字电路各部分电路与总体电路的设计、调试、模拟仿真方法。 二、整体设计 (一)设计任务与要求: 抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S0 ~ S3表示。 设置一个系统清除和抢答控制开关S,该开关由主持人控制。 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。 如果定时时间已到,无人抢答,本次抢答无效。 (二)设计原理与参考电路 抢答器的组成框图如下图所示。它主要由开关阵列电路、触发锁存电路、解锁电路、编码电路和显示电路等几部分组成。

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧