Delphi转换Unicode的问题

16

我们有一个大型商业应用程序,我们想要将其从Delphi 6转换为2010。约有10个第三方组件集,全部都带有源代码...我听说过与2010有关的Unicode警告 - 有人有经验或建议吗?

6个回答

19

有许多可供阅读的资源,可帮助您从Delphi 6迁移到Delphi 2009/2010(Unicode)。

您可以将这些文章用作指南。

  • Delphi在Unicode世界中的第二部分:支持Unicode的新RTL特性和类
  • Delphi在Unicode世界中的第三部分:使您的代码支持Unicode
  • CodeRage 4:在程序中使用Unicode和其他编码
  • 再见。


    3
    请不要忘记我在CodeRage4上分享的Unicode讲座,其中包含更多的参考资料:http://wiert.wordpress.com/2009/09/11/coderage-4-session-using-unicode-and-other-encodings-in-your-programs-chat-and-qa-transcripts/。 - Jeroen Wiert Pluimers
    @Jeroen,很棒的视频,已添加; - RRUZ

    3

    以下是一些有用的StackOverflow问题答案:

    将项目从Delphi 3迁移到Delphi 2010

    何时以及为什么应该使用TStringBuilder?

    将函数转换为Delphi 2009/2010(unicode)

    Delphi 2009/2010和Windows API调用中的Unicode问题

    此外,值得一提的是,我购买了Marco Cantu的Delphi 2009手册。它就足够让我在几周内相对顺利地从Delphi 4转换到Delphi 2009了。

    alt text

    我建议您确保您的第三方包已经升级到Delphi 2009,否则您可能会遇到一些真正的困难。转换自己的代码是一回事,转换别人的代码是另一回事。
    我使用两个带有源代码的第三方包。这两个都有可用的升级版本,其中一个开发者写道,他在将其非常复杂的组件升级为Delphi 2009的Unicode时遇到了很多麻烦。虽然花费了几个月的时间,但最终完成了。结果,当我进行升级时,我对他的组件实现没有遇到太多问题。

    1

    我必须将Carey Jensen的这篇文章添加到其他提到的文章中。它被标记为:“Delphi Unicode Migration for Mere Mortals: Stories and Advice from the Front Lines”(英文版)。 http://www.danysoft.com/free/delphiunicodemigration.pdf

    正如您在标题中所看到的,您将会发现许多经验和提示。我认为这是您问题的答案。仔细阅读后,您肯定会知道下一步该怎么做。 :)

    来源:http://www.danysoft.com/productos/migrar-aplicaciones-a-delphi-xe-o-cbuilder-xe.html


    1
    我最近也遇到了同样的情况。你主要需要关注应用程序的“边缘”。INI文件、文件I/O、日志文件等。Delphi中的Win API调用现在已经连接了Unicode API调用,因此可以正常工作。检查每个第三方组件集,确保它们至少准备好支持Delphi 2009...最好是2010。即使我的数据库使用也没有问题,几乎所有东西都可以立即正常工作。这只是小事一桩。任何依赖字符大小的内容都应该进行审核。
    实际上,最令人担忧的转换是从2007或更早版本转换到2009或更高版本。
    有很多讨论/博客文章可以参考。你可以阅读、阅读、再阅读......或者你可以开始尝试并看看会发生什么。(我两种方法都用了)。我相信有“堆栈溢出”问题讨论你的问题。我不打算详细描述可能发生的情况。
    总之,这并没有听起来那么可怕。

    1
    大约有10个第三方组件集,全部都有源代码。
    我想补充的是,如果该组件不支持Delphi 2009/2010,请不要尝试通过修改代码来升级它。
    以下是我在Delphi 2009/2010中新字符串类型的工作原理是什么?上发布的内容:
    请参阅由Marco Cantù撰写的白皮书Delphi and Unicode,以及Joel撰写的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。其中一个陷阱是默认的Win32 API调用已映射为使用W(宽字符串)版本而不是A(ANSI)版本,例如ShellExecuteA。如果您的代码正在执行假设AnsiString内部布局的棘手指针代码,则会出现问题。一种解决方法是将PChar替换为PAnsiChar,将Char替换为AnsiChar,将string替换为AnsiString,并在Win32 API调用的该部分代码末尾添加A。在代码实际编译和正常运行后,您可以重构代码以使用stringUnicodeString)。

    0
    另一个需要注意的问题是在处理字符串和使用VarType函数测试字符串时,要使用varUString而不是varString。
    假设AValue是Variant类型,并被赋予了一个Unicode字符串值,下面的代码将无法正常工作:
      if VarType(AValue) = varString then ...
    

    需要被改变为

      if VarType(AValue) = varUString then ...
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接