gpt4 book ai didi

Delphi XE - 我应该使用 String 还是 AnsiString?

转载 作者:行者123 更新时间:2023-12-03 14:38:27 25 4
gpt4 key购买 nike

我终于升级到了Delphi XE。我有一个单元库,在其中使用字符串来存储纯 ANSI 字符(A 和 U 之间的字符)。我 101% 确信我永远不会在这些地方使用 UNICODE 字符。

我想将所有其他库转换为 Unicode,但对于这个特定的库,我认为坚持使用 ANSI 会更好。优点是内存要求,因为在某些情况下我会加载非常大的 TXT 文件(仅包含 Ansi 字符)。缺点可能是,当我使这些库与普通(unicode)库交互时,我必须进行大量的类型转换。

有一些通用准则可以说明何时适合转换为 Unicode,何时适合使用 Ansi?

最佳答案

一般准则的问题在于,类似的事情可能非常具体地针对一个人的情况。您这里的示例就是其中之一。

但是,对于通过谷歌搜索并到达这里的人来说,一些一般准则是:

  • 是的,转换为 Unicode。不要尝试完全使用 AnsiString 保留旧应用程序。原因是整个 VCL 都是 Unicode,你不应该尝试混合两者,因为每次将 Unicode 字符串分配给 ANSI 字符串时都会进行转换,这是一种有损转换。因为工作量减少(或类似的原因)而试图保持旧的方式会给你带来痛苦;只需接受新的 string 类型,进行转换,然后使用它即可。

  • 不要随机混合两者,而是显式执行您需要的任何转换,一次 - 例如,如果您从旧版本的程序加载数据,您知道它将是 ANSI,因此将其读入那里有一个 Unicode 字符串,就是这样。从此以后,它将是 Unicode。

  • 您不需要更改 string 变量的类型 - D2009 之前的 string 是 ANSI,而在 D2009 和 alter 中是 Unicode。相反,请遵循 compiler warnings并观察您使用哪些字符串方法 -​​ 有些仍然采用 AnsiString 参数,我发现这一切都很令人困惑。编译器会告诉你。

  • 如果您使用字符串来保存字节(换句话说,将它们用作字节数组,因为字符是一个字节),请切换到 TBytes .

  • 您可能会遇到诸如加密之类的特定问题(字符串不再是字节/字符,因此“字符”对应“字符”,您可能会得到不同的输出);读取文本文件(使用流类和 TEncoding );坦白说,还有各种各样的东西。在这里搜索一下,大多数问题都已经被问过。

评论者,请添加更多建议...我主要使用C++Builder,而不是Delphi,并且可能有很多Delphi的具体内容我不知道。

现在回答您的具体问题:您应该转换此库吗?

如果:

  • A 和 U 之间的值确实只在这个范围内,并且
  • 这些值代表字符(A 实际上是 A,而不是字节值 65 - 如果是这样,请使用 TBytes),并且
  • 您加载大型文本文件,内存是一个问题

然后不转换为 Unicode,而是将 string 切换为 AnsiString,这是有意义的。

请注意:

  • 每次从 ANSI 转换为 Unicode 时都会产生开销
  • 您可以使用UTF8String ,这是一种特定类型的 AnsiString,转换时不会有损,并且仍将大多数文本(罗马字符)存储在单个字节中
  • string 的所有实例更改为 AnsiString 可能需要一些工作,并且您需要检查使用它们调用的所有方法,看看是否有太多隐式正在执行转换(为了性能)等
  • 您可能需要更改库的外层以使用 Unicode,以便库的用户看不到转换代码或 ANSI/Unicode 编译器警告
  • 如果转换为 Unicode,字符集(记不清语法了,也许if 'S' in MySet?)won't work 。从您对字符 A 到 U 的描述,我猜您想使用此语法。

我的建议?就我个人而言,我根据您提供的信息执行此操作的唯一原因是内存使用情况,以及可能的性能取决于您使用大量 A..U如果这确实很重要,那么它既是驱动因素又是约束因素,您应该转换为 ANSI。

关于Delphi XE - 我应该使用 String 还是 AnsiString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6049582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com