DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 1
在线用户: 6
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/23 13:33:57
标题:
delphi的unicodestring是一个失误!? 浏览:2518
加入我的收藏
楼主: 诸位,不知对delphi的unicode支持有何看法?
  我使用了一段delphi2009、2010后感觉delphi对unicode的支持方法是一个失误,主要是实现unicodestring类型且作为缺省的string是有问题的。
  我认为delphi使用utf16设计unicodestring的目的就是为了方便地利用mystring[9]之类的机制直接访问unicode字符(当然还有兼容windows),但大家都知道utf16方案的unicode字符有很多都是4字节的,对于这些字符,上述方法并没有达到目的,但该方法却为大大地增加字符串的复杂性(本来就够复杂的了:ansistring shortstring widestring pchar pansichar pwidechar  字符数组 ...)。
   其实,完全可以取消unicodestring,annistring就够了,我们都知道,delphi2009以后的ansistring和以前的的ansistring不同,增加了codepage域,delphi2007以前的ansistring由于没有codepage域所以无法区分各种字符集,增加此域后就完全可以兼容所有字符集,只需增加相互转换的机制就可以了(几个函数),至于Unicode字符,把utf16和utf8等编码方式作为codepage就可以轻易支持,兼容windows也一样,至于用数组方式访问字符串中的字符,其实也完全可以用函数来实现,而且意义更明确。
  大家以为如何?请讨论。
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2009/9/23 13:51:23
1楼:
不敢苟同。
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 xander (美是简单) ★☆☆☆☆ -
盒子活跃会员
2009/9/23 16:21:22
2楼: 楼主所言差亦。同屏显示不同CodePage的字符咋办?
----------------------------------------------
不知周之梦为蝴蝶与,蝴蝶之梦为周与?
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/23 16:41:20
3楼: 楼主所言差亦。同屏显示不同CodePage的字符咋办?
----------
ansistring完全可以使用unicode编码,同屏显示各种codepage只需把各种codepage转换为utf16编码(前面说过,此时的codepage可标记为utf16)传给windows即可。
----------------------------------------------
-
作者:
男 ilove (ilove) ★☆☆☆☆ -
盒子活跃会员
2009/9/23 16:49:45
4楼: 哈哈 吼吼
----------------------------------------------
-
作者:
男 zuobaoquan (zuobaoquan) ★☆☆☆☆ -
普通会员
2009/9/23 16:53:51
3楼: 技术上来说,AnsiString有了CodePage的确可以表示所有代码页(字符集)中的字符,但使用起来肯定更复杂、更容易混淆。(一个简单的问题,调用Windows的API的时候你敢直接用PChar转换吗?)

我个人觉得分开的好,概念上,
AnsiString主要用来表示MBCS编码的字符串;
UnicodeString、WideString用来表示UTF-16编码的Unicode字符串;(WideString还可以和COM里面的字符串兼容)
UTF8String表示UTF-8编码的Unicode字符串(虽然UTF8String是用AnsiString实现的,但仍属于Unicode字符串)
----------------------------------------------
作者:
男 zuobaoquan (zuobaoquan) ★☆☆☆☆ -
普通会员
2009/9/23 16:59:49
5楼: @xander,
楼主的意思应该是把string定义成:
string = AnsiString(1200);  // UTF-16LE 字符编码

这样的话,string就是unicode字符串了。
----------------------------------------------
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/23 17:05:46
6楼: 我以为程序员应该清楚他使用的是何种字符集,调用windows api是否需要转换也应明白,否则即使使用unicodestring恐怕也是一笔糊涂帐。
----------------------------------------------
-
作者:
男 preserve (叶孤枫) ★☆☆☆☆ -
普通会员
2009/9/23 20:43:21
7楼: c++里不也有wstring么
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2009/9/23 21:34:54
8楼:
按楼主这么说,把你所说的AnsiString存到数据库里是不是也要得把CodePage得记录下来???

楼主觉得这样可以玩下去???
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2009/9/23 21:35:44
9楼:
数据库里一条记录包含N种CodePage的内容,会很壮观的。
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 egust (欢迎访问 Delphi@smth.org) ★☆☆☆☆ -
普通会员
2009/9/23 22:27:06
10楼: nt内核是unicode的,ansi版本的api都会转成unicode版本,效率相对很低
要是一开始就全世界统一的话,code page这种东西就不该存在,带来了很多麻烦,现在居然还有人死抱着code page不放
----------------------------------------------
cnblogs中我写的关于Delphi的blog,欢迎访问:
http://www.cnblogs.com/egust/
作者:
男 datm (dATM) ★☆☆☆☆ -
盒子活跃会员
2009/9/24 1:05:50
11楼: nt内核是unicode的,ansi版本的api都会转成unicode版本,效率相对很低
要是一开始就全世界统一的话,code page这种东西就不该存在,带来了很多麻烦,现在居然还有人死抱着code page不放
---------- 
涉及到非常需要节省流量的时候你就不会这么想了
----------------------------------------------
-
作者:
男 kingage (kingage) ★☆☆☆☆ -
盒子活跃会员
2009/9/24 13:07:29
12楼: 我认为主要是效率问题,不然每次都需要转换很浪费时间的。

另外,回11楼:如需节省流量,则用ansi传递即可,到对方在转换回来,只损失一次效率却同样保证了需求。
----------------------------------------------
Just run it!按此在新窗口浏览图片
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/24 15:11:30
13楼: 按楼主这么说,把你所说的AnsiString存到数据库里是不是也要得把CodePage得记录下来???
----------
存数据库时可以存为utf8或是uft16完全。实际上,数据库的字符串如何存储和本文主题无关。
----------------------------------------------
-
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/24 15:17:24
14楼: 数据库里一条记录包含N种CodePage的内容,会很壮观的。
----------
delphi的字符串不仅有codepag域,还有引用技术和长度域,你是否认为这些域数据库中都保存了?
数据库中字符串存储格式和delphi的字符串格式无关,其存储格式取决于程序员和驱动程序。
----------------------------------------------
-
作者:
男 lfxsq (lfxsq) ★☆☆☆☆ -
普通会员
2009/9/24 15:33:38
15楼: 楼上有人你说code page这种东西就不该存在,不错,但事实上中国政府明确要求在中国软件必须支持国标(gb18030之类),windows底层使用unicode,表层却不用unicode而使用gb18030,为何?国家要求的!,至于还有人死抱着code page不放,是因为许多国家都有自己的标准,windows本身就抱着codepage放不下。
----------------------------------------------
-
作者:
男 penal (法) ★☆☆☆☆ -
盒子活跃会员
2009/9/24 15:50:15
16楼: UnicodeString已经不错了, 至少可以干活了。

gb18030 其实在Windows上是不可用的。别看MS“好像”已经支持它了,其实很难的。再者gb18030“基本上”可以和Unicode互换,不是特殊应用的话可以不管。我觉得挺郁闷的,谁叫OS不是中国开发的。
----------------------------------------------
-
作者:
男 doorkey (DoorKey) ★☆☆☆☆ -
盒子活跃会员
2009/9/24 18:06:51
17楼: delphi的字符串不仅有codepag域,还有引用技术和长度域,你是否认为这些域数据库中都保存了?
数据库中字符串存储格式和delphi的字符串格式无关,其存储格式取决于程序员和驱动程序。

----------

楼主,你想的太搞笑了吧。没错,存到数据库里可以用UTF8或UTF16。但是一个数据库管理软件或ERP,每个都要这样来转换,除了楼主以外没人会去开发软件了。
----------------------------------------------
QQ: 9717005 我的Blog:http://www.cnblogs.com/anydelphi/
作者:
男 yxsoft (yxsoft) ★☆☆☆☆ -
盒子活跃会员
2009/9/25 9:19:53
18楼: LZ自己没搞明白
----------------------------------------------
Great!
作者:
男 learu (learu) ★☆☆☆☆ -
盒子活跃会员
2009/9/25 9:34:04
19楼: LZ是来找喷的
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行99.97559毫秒 RSS