分享

使用ZEOS控件在DELPHI2007下连接SQLITE文件的乱码问题

 quasiceo 2013-11-14
-- 基于SQLite的编程
--- 使用ZEOS控件在DELPHI2007下连接SQLITE文件的乱码问题

作者:erman    时间:2009-4-6 17:28:28    标题:使用ZEOS控件在DELPHI2007下连接SQLITE文件的乱码问题

我在DELPHI2007下使用ZEOS连接SQLITE数据库(3.6版本,UTF8编码),读取出来的数据只要是汉字的就是乱码,上网查了些资料后发 现要在ZConnection的Properties下指定编码方式。但是自己试的时候无论如何都不能正确的读取中文,请各位帮帮忙,看下这个问题怎么解 决,最好可以做个简单的例子,多谢多谢!
作者:onionzq    时间:2009-5-4 21:10:59

研究得咋样了啊,应该成功了吧,俺也是来学习的。。。

^_^, 取经来了啊。。。
作者:流水之波    时间:2009-5-10 10:34:21

关注中。

如果sqlite是从别的工具转换过来的,则数据库内可能已经是UTF8类型编码,要想显示在Delphi程序中,就必须使用类似于下面的语句,即显示时用 UTF8DECODE() 和保存到数据库中时用UTF8ENCODE()函数。
edt1.Text:= Utf8Decode(zqry1.FieldValues['area']);
单个字段显示的没有问题。
但是要是用dbgride 这样的表格同时显示多个字段呢。这样就很不方便吧。使用sql语句时还必须考虑编码问题。
即仅仅select * from areabiao where area='北京' 是不行的。因为数据库存的是UTF8编码,是找不到unicode'北京'的,必须转换成UTF8'北京'才可以。

如 果sqlite 数据库是自己建立的,则可能是unicode编码,能在Delphi程序中正常显示,但是这样的表格在SharpPlus SQLite Developer 里显示不出来;但是在DBTools Manager Professional里却能正常显示。使用sql语句时不用考虑 编码问题。
select * from areabiao where area='北京'

我试验了好几次,若数据库要么只能在SharpPlus SQLite Developer 里显示,要么只能在DBTools Manager Professional 里显示。

SQLLite Expert Professional ,Tools菜单、Options、General项中、Encoding组,选中UTF-8。 能显示 utf8 不乱码;
SQLLite Expert Professional ,Tools菜单、Options、General项中、Encoding组,选中default ansi page 。 能显示 我们常见的编码不乱码。

但是要是在SQLLite Expert Professional的 default ansi page 手工输入数据,则保存后也为乱码。或许我对这工具还不是很熟悉。



我用的也是ZEOS 控件。

sqlite 数据库内为unicode 时,delphi编写程序方便许多。存在的问题是sqlite本身是以UTF8强制保存的,整体数据库要有个转换的过程,也存在有些sqlite管理器显示出乱码的问题。

sqlite 数据库内为UTF8时,delphi 编写程序就麻烦许多,每次取出数据和保存数据都要手工加上编码转换代码。若是ZEOS 控件能支持UNICODE就好了,不过我看了zeos控件作者对zeos控件的发展规划说,打算对以后的zeos 7.x控件增加支持unicode的功能,不过要放弃对delphi 6 和delphi 6以下编辑器的支持。可惜我用的是delphi 6 IDE,我安装的许多第三方控件都是在delphi 6下面的,或许许多人目前使用的也都是delphi 6吧。

虽然asqlite 控件支持 unicode ,但是asqlite控件不支持对数据库的加密的封装,或许以后升级了能增加这个功能。


总体上看,或许自己的sqlite 数据库内使用unicode 是一个比较简单的解决方案,不过存在的问题就是国际趋势是使用utf8编码,xml文件也是用的utf8编码。

能不能折中一下:哪位高手可以参考(1)www.上的空间支持unicode的sqlite3控件;2) asqlite 控件) 这个控件的源码,来修改zeos 控件的源码啊,使其能支持unicode。





作者:流水之波    时间:2009-5-10 10:37:12

上述的unicode 实质为 charset=gb2312编码
UTF8 实质为 charset=utf-8
作者:流水之波    时间:2009-5-11 16:42:15

http://blog.csdn.net/cgh_chen/archive/2008/05/22/2468300.aspx
1. 使用sqlite3_prepare执行的SQL语句,必须编码成UTF8格式;Delphi: AnsiToUTF8转换
2. 如果使用sqlite3_bind_text绑定文本,也必须编码成UTF8格式
3. 字符读出来后,也必须转换成GB2312编码,UTF8ToAnsi(Result)这样就不存在,查询不出内容的问题。




确实是解决 模糊查询的好方法。
sqlite 里还是直接以 UTF8存储比较好,免得出现模糊查询的错误。
不过我要想在dbgrid里直接显示和编辑就有问题了。
dbgrid里直接显示 utf8 是乱码
此时手工输入的文字,全是gb2312,就转回到前面说的问题了,不应该以gb2312来保存。
壁合(10889655) 13:33:35
既然 sqlite expert professional 能显示出来 UTF8 的数据表。
不知道它里面用的是不是dbgrid 反正是个表格形式的。

我想dbgrid通过类似于 utf8encode utf8decode 的方式也可以实现吧。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多