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的内容。








...全文
1708 17 打赏 收藏 转发到动态 举报
写回复
用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是不同的吧。

1,178

社区成员

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

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