DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 28
在线用户: 17
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/20 9:29:13
标题:
Delphi2010 开发unicode多语言程序,存取乱码,数据库为Oracle11G 浏览:5585
加入我的收藏
楼主: 操作系统:Win2003 简体中文环境
数据库:ORacle 11G, 字符集为AL32UTF8,应用程序Oracle客户端字符集也设为AL32UTF8
开发工具:Delphi2010
状况描述:

(1)使用ADOQuery 查询通过 ORacle SQL Developer插入的泰文,显示为乱码。插入泰文时,存入数据库的为问号,因为Oracle客户端和服务器字符集一致,所以在存储时,两边的字符集未做转换,显示为问号,可能是操作系统不识别泰文,在编辑框中输入泰文是没有问题的,这一块不清楚是如何转换的。

(2)通过select dump(字段)from 表名,看到的实际存储值为63,存入中文时,存入的内容为非unicode字符,应该是ansi简体中文编码的,例如,存入中文”汉“,数据库存储的是两个字节,通过ORacle SQL Developer存入"汉"这个汉字,占用的是3个字节,Delphi在存储、读取utf8编码的数据,是不是需要通过一些函数进行转换?

(3)查找资料说Delphi2010默认是unicode的,但我这样简单使用写出的程序应该不是unicode的,我将区域与语言选项时,非unicode程序的默认显示语言修改为泰文,Oracle客户端字符集设为泰文字符集,这样字符集转换由Oracle数据库来进行,是可以正确的存取泰文,但是存取中文则编程了乱码。我想知道的是如何使用Delphi2010编写真正的unicode程序,用户不用做任何变动,即可存取各种文字。
----------------------------------------------
-
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/20 10:01:39
1楼: 没有人遇到过这个问题吗?
----------------------------------------------
-
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/20 16:03:53
2楼: 人气好低啊
----------------------------------------------
-
作者:
男 ww1000 (Delphis) ▲▲▲▲▲ -
普通会员
2012/4/20 17:26:16
3楼: 顶一下
如果没人回答。。自己用谷歌搜索下吧
----------------------------------------------
阳光总在
作者:
男 xxhadsg (garfield) ★☆☆☆☆ -
盒子活跃会员
2012/4/20 18:40:13
4楼: 使用UniDac,设置字符集为数据库字符集试试.我原来连接过Oracle,也出现过乱码,使用UniDac指定字符集后就可以了.
----------------------------------------------
这个世界上还有很多比钱更重要的东西,比如说意大利面---加菲猫
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/23 17:52:30
5楼: 恩恩,感谢xxhadsg,换成uniDac,将useunicode属性设为true,就可以正常的获取数据了,但存储的时候还是乱码,后将存储语句修改为param参数方式,可以正常存入utf8字符,其他的还在研究。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2012/4/24 2:55:28
6楼: 我用unidac+mysql,怎么样读写unicode都没有问题。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/24 9:32:42
7楼: 回nevergrief:
useunicode参数确实不用设置,不过存储的时候还是只能使用param参数方式,使用以下这种写法,存储的都是问号,就是系统无法识别:
str := ' insert into sms_test_tab(id,name) '
          +'values('+edtID.Text+','''+edtName.Text+''')';
UniQuery1.Close;  //存储乱码
UniQuery1.SQL.Text := str
UniQuery1.Execute;

只能使用这种方式:
str :=  ' insert into sms_test_tab(id,name) '
          +' values(:ID,:NAME)
UniQuery1.Close;
UniQuery1.SQL.Text := str;
UniQuery1.ParamByName('ID').AsString := edtID.Text;
UniQuery1.ParamByName('NAME').AsString := edtName.Text;
UniQuery1.Execute;
----------------------------------------------
-
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/25 11:56:01
8楼: xxhadsg 和 nevergrief 在吗?
有没有办法使用这种方式以下方式进行存储?
str := ' insert into sms_test_tab(id,name) '
          +'values('+edtID.Text+','''+edtName.Text+''')';
UniQuery1.Close;  //存储乱码
UniQuery1.SQL.Text := str
UniQuery1.Execute;

我发现查询的时候也必须使用param参数方式,否则查询语句正确,也会查不出结果。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2012/4/25 15:34:58
9楼: 怎么写sql语句无所谓,关键是数据库存储编码、连接编码必须是utf8,此外uniConnection必须写清楚使用utf8,UseUnicode=true
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/25 16:04:23
10楼: 我这不知道是什么原因,我的数据库编码是AL32UTF8,客户端系统环境变量NLS_LANG设置为AMERICAN_AMEIRCA.AL32UTF8,uniconnection连接字符集设置为AL32UTF8,useUnicode=true,direct = false,其他的地方没做特殊变动,但是查询和存储的时候,都必须通过parambyname方式来传递查询条件和存储内容。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2012/4/25 18:00:00
11楼: 你具体的情况怎么解决不清楚,但是我给你一些经验也许可以帮你启发思路。

1. 输入SQL的“编辑器”很有讲究。
我前一阵也碰到了问题,数据库连接、存储都是utf8,无论怎么设置读出来的数据就是错误的。后来发现,虽然数据库里是utf8,但用delphi的ansi编码反而能把它正确的读出来。发现这点后就很好解释了。我是使用5年前的mysql cc控制中心输入的sql语句,其中包含了中文字符串。我估计mysql cc只能按照ansi来解析字符、并插入,因此怎么样都是错的。重新用支持unicode的编辑器输入后(比如Mysql front),就正确了。

这个问题很常见。在非纯中文的ANSI环境下,同一段代码,拷贝粘贴到记事本就显示中文,拷贝到editplus就显示乱码(尽管editplus支持unicode也是原生的)。VC6的编辑器也是显示乱码,而ultraedit却又是中文。

2. 我记得泰文有可能是从右向左编码的,这个会有影响吗?要不要设置bidimode?

3. 你可以给我oracle的公网IP,用户名/密码,我直接在这里使用unidac插入数据试试。但是我不想在我这里装oracle了,太大,而且N年没用它了。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2012/4/25 18:05:40
12楼: 补充解释第一点:ansi编辑器把中文字符的编码按照ansi解析了,然而数据库接口是utf8吧,就把这个解析后的ansi按照utf8自动转换并存储了。这样的编码从编辑器一开始就是错的,以这个为基础,后面无论怎么转换都没用,自然不能得到正确的unicode编码。

比如“汉”的ANSI编码和utf8编码完全不是同一个东西。但是把“汉”的编码的两个byte分别按照utf8存储,其实还是ansi编码。

但这点仅是我的猜测,没时间仔细验证。但我的确使用这个思路解决了问题。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/4/26 12:00:07
13楼: 存储中文的时候,确实是存储的utf8编码,但存储泰文时,存储的是问号“?”,也就是说无法识别泰文,但我系统里已经安装了泰文字库,界面上的edit编辑框可以正常输入,另外我从数据库中,出入utf8编码的泰文,通过uniquery查询时,如果不设查询条件,查询所有的数据是可以查询到泰文记录,但设置查询条件,则无法查询到,这时,使用parambyname的方式,却可以查询到泰文记录,

另外我有个疑问的地方时,delphi2010怎么编写才是unicode程序,vc好像是增加一条语句就可以了,delphi2010就不大清楚了

对于泰文,我将控制面板,区域与语言选项里,非unicode语言选择泰文,oracle客户端nls_lang设置为泰文,utf8转换通过oracle进行,使用oracle原生的adoquery也可以正常的存储、读取泰文,说明这程序不是unicode程序,我现在就是想把程序编写完完全的unicode,可以同时存储中文、泰文等字符,不知道从那一块入手,网上也没找到相关的文档。
----------------------------------------------
-
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2012/4/30 17:53:51
14楼: 你的第二个问题:delphi2010编写出来的程序,一定是unicode程序,不用加任何语句。但是注意源代码文件要用utf8存储,否则会丢失字符(特别是经过别人修改之后),如果是这样那unicode程序也只能显示???了。

你把你含有泰文的delphi2010程序发给我,oracle的表结构也发给我,我把它转成mysql试试,这样也许也可以帮你找出delphi程序的错误。

nevergrief@hotmail.com
----------------------------------------------
只有偏执狂才能生存!
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/7/17 14:10:11
15楼: 最近一直再做界面多语言字符串的整理工作,今天回头重新调试了下这个问题,发现原因出现在驱动方式上,更改后就可以了。
原来连接字符串是微软提供的,内容如下:
Provider=MSDAORA.1;Password=smsmulti;User ID=smsmulti;Data Source=orcl;Persist Security Info=True
修改为Oracle提供的驱动。
Provider=OraOLEDB.Oracle.1;Password=smsmulti;User ID=smsmulti;Data Source=orcl;Persist Security Info=True
----------------------------------------------
-
作者:
男 lixingyan (123456) ★☆☆☆☆ -
普通会员
2012/7/17 14:27:00
16楼: 花了点时间,装了mysql 通过odbc进行连接,可以正常存取unicode字符,后来把oracle连接也改成odbc,问题来了,可以正常存unicode字符,但读取则乱码,这其中不知道涉及什么问题。
----------------------------------------------
-
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2012/7/17 16:22:30
17楼: 做了for SQL Server多语言版框架,其实略改下,可支持MySQL or Oracle or TXT都行。。。还是折腾了几天
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行93.75毫秒 RSS