很多方面的消息说Delphi的工程师开始将VCL修改成支持UNICODE的了。在不久未来,VCL就可以真正的支持Unicode了。假如你是Delphi的VCL支持Unicode的项目设计者,你将怎么设计和完成这个任务呢?请大家各抒己见。

解决方案 »

  1.   

    1, 备份原来的 vcl 源码
    2, cd 到 vcl 源码所在顶级目录
    3, find string replace widestring;
        find ....   replace ....
        ...
       
    4,  开始调试程序的bug, 预计到 2008 或者 2009 吧
      

  2.   

    高手就是高手,不同凡响郁闷着呢:
    http://community.csdn.net/Expert/topic/5430/5430393.xml?temp=.2256739
      

  3.   

    aiirii(ari-http://spaces.msn.com/members/aiirii/) ( 五星(高级)) 信誉:420
    看到星星我就吓晕了
      

  4.   

    在没把台湾统一的时候,VCL实现UNICODE很重要,如果BORLAND的人不出手,估计很麻烦,
      

  5.   

    台湾统一在第一位~~~~~~UNICODE在第二位
      

  6.   

    {$UICODE+}
    String=WideStringSetWindowText = SetWindowTextW{$UICODE-}
    String=AnsiStringSetWindowText = SetWindowTextA
      

  7.   

    sxfp
    先申请经费,成功后开会研究买什么牌子多少钱的电脑比较好.起码要买一台吧.然后研究让who去买,然后.... 接着就是zswang说的,然后就阿日的.
      

  8.   

    先买一本书回去研究一下到底什么是UniCode
      

  9.   

    先买一本书回去研究一下到底什么是UniCode
    经典,我也要研究一下才行.
      

  10.   

    回复人:aiirii(ari-http://spaces.msn.com/members/aiirii/) ( 五星(高级)) 信誉:420  2007-3-30 11:02:22  得分:0
    ?  1, 备份原来的 vcl 源码
    2, cd 到 vcl 源码所在顶级目录
    3, find string replace widestring;
    find .... replace ....
    ...4, 开始调试程序的bug, 预计到 2008 或者 2009 吧
    -----------------------------------------
    首先,这个问题涉及VCL的基础RTL,不只是VCL的事;
    第二,这样整个VCL一起改不bug 多多才怪,如果这么简单,VCL早支持UNICODE。
    第三,ansistring和widestring是不兼容的,新版VCL不能因为支持unicode而影响对ansistring的兼容。
    最候,同意GoldShield的意见,UNICODE支持不只设及simplified Chinese和traditional Chinese要回答这个问题需要深入研究过VCL的架构,我没有,所以没法回答,但可以肯定这个过程中DUNIT的功德必定无量。
      

  11.   

    干嘛Delphi支持Unicode呀,.net就支持得很好,郁闷啊
    上次想开发一个小语种版的软件硬是没办法
      

  12.   

    比较麻烦,不过暂时还不需要用Unicode
    目前的Ansi足够了
    我更希望是看见对Windows Mobile/CE, DDK,X64的Native支持
      

  13.   

    涉及到string的方法可以用重载的办法来解决,
    但是属性不能重载,是一个大的麻烦。
      

  14.   

    不过unicode只是在需要同时使用多个多字节字符集的时候才是必要的,还不是非常急需。:)
      

  15.   

    回复人:DelphiGuy() ( 五级(中级)) 信誉:100  2007-3-31 14:24:49  得分:0
    ?  涉及到string的方法可以用重载的办法来解决,
    但是属性不能重载,是一个大的麻烦。
    ----------------------------
    这只是在程序员层面的解决办法吧,还不能到达楼主说的Delphi工程师层面的解决方案
      

  16.   

    楼主站的高度是不是太高了?
    作为一个普通的Delphi程序员,如果在Delphi所属公司还没有完整的解决方案出来前
    是不是讨论该如何让自己的程序支持宽字符集更有意义?
      

  17.   

    宝蓝的东西搞这些都不行.包括bcb
      

  18.   

    没有包袱,假定ANSI不存在,哪还有这么多事?
      

  19.   

    如果要让自己的程序支持Unicode, 可以使用TNT那一套控件。目前支持Unicode方面,Delphi2006的ADO相关的控件可以支持Unicode, 但是有BUG。另外,简单的在中文系统中显示中文,在韩文中显示韩文,目前的VCL就是可以的。但是如果要在英文系统中同时显示中文和韩文目前的VCl是不行的,好像连TNT那套都不行(好像是需要编码)。不行的原因是:从WideString 转到(传递参数等) String 时,丢掉了WideString的信息。因此现在的VCL基本结构是不行的。对于一楼的直接将String替换成 WideString, 我认为也是存在问题的,这样一来新发布的Delphi完全就不能兼容老的程序代码了。同前面的高人说得一样,我认为应该引入一个编译开关。如果这个编译开关是打开的,那么所有的String类型等同于WideString。一系列对XXXXA API的调用自动转换为对 XXXXW 的API的调用。如果还是要使用旧的String类型,可以使用AnsiString类型。编译开关是关闭的,就同现在一样,String <> WideString这样,就只要修改编译器就可以了。当然这样还有问题,如果只包含DCU文件发布的组件,就会存在问题,即如果DCU是AnsiString方式编译的,就不能被WideString类型的应用编译,否则会出问题。
      

  20.   

    转换
    UnicodeLetterEntries = 1492; // ~7K table
      UnicodeLetterInfo : Array[0..UnicodeLetterEntries - 1] of TUnicodeLetterInfo = (
        (Unicode:#$0041; Attr:laUpper; CaseCode:#$0061),   // LATIN CAPITAL LETTER A
        (Unicode:#$0042; Attr:laUpper; CaseCode:#$0062),   // LATIN CAPITAL LETTER B
        (Unicode:#$0043; Attr:laUpper; CaseCode:#$0063),   // LATIN CAPITAL LETTER C
        (Unicode:#$0044; Attr:laUpper; CaseCode:#$0064),   // LATIN CAPITAL LETTER D
        (Unicode:#$0045; Attr:laUpper; CaseCode:#$0065),   // LATIN CAPITAL LETTER E
        (Unicode:#$0046; Attr:laUpper; CaseCode:#$0066),   // LATIN CAPITAL LETTER F
        (Unicode:#$0047; Attr:laUpper; CaseCode:#$0067),   // LATIN CAPITAL LETTER G
        (Unicode:#$0048; Attr:laUpper; CaseCode:#$0068),   // LATIN CAPITAL LETTER H
        (Unicode:#$0049; Attr:laUpper; CaseCode:#$0069),   // LATIN CAPITAL LETTER I
        (Unicode:#$004A; Attr:laUpper; CaseCode:#$006A),   // LATIN CAPITAL LETTER J
        (Unicode:#$004B; Attr:laUpper; CaseCode:#$006B),   // LATIN CAPITAL LETTER K
        (Unicode:#$004C; Attr:laUpper; CaseCode:#$006C),   // LATIN CAPITAL LETTER L
        (Unicode:#$004D; Attr:laUpper; CaseCode:#$006D),   // LATIN CAPITAL LETTER M
        (Unicode:#$004E; Attr:laUpper; CaseCode:#$006E),   // LATIN CAPITAL LETTER N
        (Unicode:#$004F; Attr:laUpper; CaseCode:#$006F),   // LATIN CAPITAL LETTER O
        (Unicode:#$0050; Attr:laUpper; CaseCode:#$0070),   // LATIN CAPITAL LETTER P
        (Unicode:#$0051; Attr:laUpper; CaseCode:#$0071),   // LATIN CAPITAL LETTER Q
        (Unicode:#$0052; Attr:laUpper; CaseCode:#$0072),   // LATIN CAPITAL LETTER R
        (Unicode:#$0053; Attr:laUpper; CaseCode:#$0073),   // LATIN CAPITAL LETTER S
        (Unicode:#$0054; Attr:laUpper; CaseCode:#$0074),   // LATIN CAPITAL LETTER T
        (Unicode:#$0055; Attr:laUpper; CaseCode:#$0075),   // LATIN CAPITAL LETTER U
        (Unicode:#$0056; Attr:laUpper; CaseCode:#$0076),   // LATIN CAPITAL LETTER V
        (Unicode:#$0057; Attr:laUpper; CaseCode:#$0077),   // LATIN CAPITAL LETTER W
        (Unicode:#$0058; Attr:laUpper; CaseCode:#$0078),   // LATIN CAPITAL LETTER X
        (Unicode:#$0059; Attr:laUpper; CaseCode:#$0079),   // LATIN CAPITAL LETTER Y
        (Unicode:#$005A; Attr:laUpper; CaseCode:#$007A),   // LATIN CAPITAL LETTER Z
        (Unicode:#$0061; Attr:laLower; CaseCode:#$0041),   // LATIN SMALL LETTER A
        (Unicode:#$0062; Attr:laLower; CaseCode:#$0042),   // LATIN SMALL LETTER B
        (Unicode:#$0063; Attr:laLower; CaseCode:#$0043),   // LATIN SMALL LETTER C
        (Unicode:#$0064; Attr:laLower; CaseCode:#$0044),   // LATIN SMALL LETTER D
        (Unicode:#$0065; Attr:laLower; CaseCode:#$0045),   // LATIN SMALL LETTER E
        (Unicode:#$0066; Attr:laLower; CaseCode:#$0046),   // LATIN SMALL LETTER F
        (Unicode:#$0067; Attr:laLower; CaseCode:#$0047),   // LATIN SMALL LETTER G
        (Unicode:#$0068; Attr:laLower; CaseCode:#$0048),   // LATIN SMALL LETTER H
        (Unicode:#$0069; Attr:laLower; CaseCode:#$0049),   // LATIN SMALL LETTER I
        (Unicode:#$006A; Attr:laLower; CaseCode:#$004A),   // LATIN SMALL LETTER J
        (Unicode:#$006B; Attr:laLower; CaseCode:#$004B),   // LATIN SMALL LETTER K
        (Unicode:#$006C; Attr:laLower; CaseCode:#$004C),   // LATIN SMALL LETTER L
        (Unicode:#$006D; Attr:laLower; CaseCode:#$004D),   // LATIN SMALL LETTER M
        (Unicode:#$006E; Attr:laLower; CaseCode:#$004E),   // LATIN SMALL LETTER N
        (Unicode:#$006F; Attr:laLower; CaseCode:#$004F),   // LATIN SMALL LETTER O
        (Unicode:#$0070; Attr:laLower; CaseCode:#$0050),   // LATIN SMALL LETTER P
        (Unicode:#$0071; Attr:laLower; CaseCode:#$0051),   // LATIN SMALL LETTER Q
        (Unicode:#$0072; Attr:laLower; CaseCode:#$0052),   // LATIN SMALL LETTER R
        (Unicode:#$0073; Attr:laLower; CaseCode:#$0053),   // LATIN SMALL LETTER S
        (Unicode:#$0074; Attr:laLower; CaseCode:#$0054),   // LATIN SMALL LETTER T
        (Unicode:#$0075; Attr:laLower; CaseCode:#$0055),   // LATIN SMALL LETTER U
        (Unicode:#$0076; Attr:laLower; CaseCode:#$0056),   // LATIN SMALL LETTER V
        (Unicode:#$0077; Attr:laLower; CaseCode:#$0057),   // LATIN SMALL LETTER W
        (Unicode:#$0078; Attr:laLower; CaseCode:#$0058),   // LATIN SMALL LETTER X
        (Unicode:#$0079; Attr:laLower; CaseCode:#$0059),   // LATIN SMALL LETTER Y
        (Unicode:#$007A; Attr:laLower; CaseCode:#$005A),   // LATIN SMALL LETTER Z
        (Unicode:#$00AA; Attr:laLower; CaseCode:#$FFFF),   // FEMININE ORDINAL INDICATOR
        (Unicode:#$00B5; Attr:laLower; CaseCode:#$039C),   // MICRO SIGN
        (Unicode:#$00BA; Attr:laLower; CaseCode:#$FFFF),   // MASCULINE ORDINAL INDICATOR
        (Unicode:#$00C0; Attr:laUpper; CaseCode:#$00E0),   // LATIN CAPITAL LETTER A WITH GRAVE
        (Unicode:#$00C1; Attr:laUpper; CaseCode:#$00E1),   // LATIN CAPITAL LETTER A WITH ACUTE
        (Unicode:#$00C2; Attr:laUpper; CaseCode:#$00E2),   // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
        (Unicode:#$00C3; Attr:laUpper; CaseCode:#$00E3),   // LATIN CAPITAL LETTER A WITH TILDE
        (Unicode:#$00C4; Attr:laUpper; CaseCode:#$00E4),   // LATIN CAPITAL LETTER A WITH DIAERESIS
        (Unicode:#$00C5; Attr:laUpper; CaseCode:#$00E5),   // LATIN CAPITAL LETTER A WI
      

  21.   

    {$UICODE+}
    String=WideStringSetWindowText = SetWindowTextW{$UICODE-}
    String=AnsiStringSetWindowText = SetWindowTextA
        应该不会这么简单吧,很多vcl组件都是用string参数,这么改一下,会出问题的。
        因为这些vcl组件使用string的参数的时候,很多情况下是用win32api处理的,string变成了widestring,难道没有问题?
        不信你改完后比如用RichEdit组件试一下,不出问题才怪!!
      

  22.   

    上次去了CodeGear的產品介紹會.
    Delphi2007已經支持Unicode了!而且相當好用.
      

  23.   

    胡扯,什么时候说支持Unicode了,只是说正在计划开发当中做Unicode VCL最重要的问题是向后兼容,也就是要保证Ansi VCL仍然可用。
      

  24.   

    1. 方法。
    可以通过增加一个同名的重载方法来解决,可以保证100%的兼容性。现在Indy之类的VCL组件中已经大量使用这种技巧。2. 属性。
    尽管不能重载(理论上来说也可以修改编译器以支持重载),也有办法解决。
    (1). 强制string类型的属性(也包括对象的string类型成员)使用WideString,因为现在编译器已经能够对AnsiString和WideString类型之间的互相赋值自动转换,所以编译器不需要做任何修改。缺点是部分用户代码可能需要修改。
    (2). 修改编译器,在RTTI中增加区分AnsiString和WideString的信息,增加一个类似SizeOf的TypeOf(或者直接使用is关键字也可以)。
      

  25.   

    之后当然是对VCL源码进行必要的改写即可了。:)