【问题标题】:Delphi AnsistringsDelphi Ansistrings
【发布时间】:2011-07-03 11:24:38
【问题描述】:

我在这里有一个案例,我打算从 Delphi 7 迁移到 delphi 2011 XE,令我惊讶的是,许多组件会因为 ansistrings 而出现问题,在 delphi xe 中它们看起来像日文/中文字符,现在是单位我使用的是 PCSC 连接器,似乎已从原始开发人员中停产/放弃。

基本上我想要的是一种简单的方法来再次读取字符串,尽可能少地修改原始代码..

另外,如果有任何关于如何为 2009 年及更新版本准备好组件 ansistring 的好的教程也会对我有所帮助

【问题讨论】:

标签: delphi delphi-2010 delphi-7 ansistring


【解决方案1】:

Delphi(我认为是在 Delphi 2009 之前)的重大变化是别名字符串类型;在 2009 年之前是 ANSI 字符串类型的 string、Char、PChar 等现在都是 WideChar 类型。

所以

Type   | Delphi 6,7 | Delphi 2009, XE
-------+------------+----------------
string | AnsiString | UnicodeString
char   | AnsiChar   | WideChar
pchar  | PAnsiChar  | PWideChar

从 Ansi Delphi 迁移到 Unicode Delphi 最简单的方法是全局搜索和替换别名字符串类型,将它们替换为显式的 8 位 ANSI 等效项(即用 AnsiString 替换所有字符串,用 PAnsiChar 替换 PChar 等。 .)

这应该能让你完成 90% 的工作。


更新 在阅读了我的回答和the article referenced by @O.D的cmets之后 我认为硬着头皮使用 Unicode 的建议是更明智的选择。

【讨论】:

  • 我想推荐相反的。接受对 Unicode 的更改,并更改您的应用程序以使用 Unicode 正常工作。
  • 从长远来看,这将是可取的。但我的回答是基于 Plastkort 要求最简单让他的应用程序再次运行的请求。长期采用 unicode 是正确的答案,但我认为它在短期内可能需要做更多的工作。
  • 在我看来可能更容易接受!
  • 在 Delphi 2009+ 中,字符串是 UnicodeString,而不是 WideString(在大多数情况下不计入引用且速度较慢)
  • @Pete,“拥抱变化”并转换为 Unicode 实际上可能更快。我希望大多数 OP 的应用程序都专门使用 STRING。如果您陷入将所有字符串转换为 AnsiString 并将所有字符转换为 AnsiChars 在一个单元中 的陷阱,那么您最终会在所有地方都做同样的事情,因为您的所有其他代码都与它交互单元。而且您无法更改所有内容,因为 VCL 现在是 Unicode,因此当您尝试将控件的 Caption 设置为某个字符串时会收到警告,因为您只是将本地变量从字符串更改为 AnsiString。
【解决方案2】:

@Plastkort, Delphi >= 2009 完全能够读取和处理 AnsiString。如果您以某种方式将 ANSI 数据硬转换为 Unicode(可能通过硬转换指向 PChar 的指针),您只会得到无意义的字符。

如果我必须将其他人的代码转换为 Unicode,我会首先搜索 PChar、Char 和 String,并专门查看其他类型被硬转换为这些类型的地方。那是因为这些类型改变了含义:在非 Unicode delphi 中,CHAR 是 1 个字节,现在是 2 个字节。

转换本身并不难,您只需要了解您面临的问题,并且您需要对您正在转换的代码有很好的理解。而且工作量很大,尤其是在处理“使用字符串进行智能处理”的代码时。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2011-05-12
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多