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

WeG*_*ars 12 delphi delphi-unicode

我终于升级到了Delphi XE.我有一个单元库,我使用字符串来存储普通的ANSI字符(A和U之间的字符).我101%肯定我永远不会在那些地方使用UNICODE字符.

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

有一些通用指南可以说明何时转换为Unicode以及何时坚持使用Ansi?

Dav*_*vid 11

一般指导方针的问题在于,这样的事情可能非常特定于某人的情况.你的例子就是其中之一.

然而,对于谷歌搜索和到达这里的人来说,一些一般性指导方针是:

  • 是的,转换为Unicode.不要试图使用AnsiStrings 完全保留旧应用程序.原因是整个VCL都是Unicode,你不应该试图将两者混合,因为每次将Unicode字符串分配给ANSI字符串时都会进行转换,这是一种有损转换.试图保持旧的方式,因为它的工作量较少(或类似的原因)将导致你的痛苦; 只需拥抱新string类型,转换,并与它一起去.

  • 而不是随机混合两者,显式执行您需要的任何转换,例如,如果您从程序的旧版本加载数据,您知道它将是ANSI,那么将其读入Unicode字符串,并且而已.从那以后,它将是Unicode.

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

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

  • 您可能会遇到加密等问题的特定问题(字符串不再是字节/字符,因此'字符'的'字符'可能会得到不同的输出); 读取文本文件(使用流类和TEncoding); 而且,坦率地说,杂项.在这里搜索,大多数事情都被问过.

评论者,请添加更多建议......我主要使用的是C++ Builder,而不是Delphi,对于Delphi我可能还有不少具体的东西我不知道.

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

如果:

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

然后不转换为Unicode,而是将strings 切换为AnsiStrings,这是有道理的.

意识到:

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

我的推荐?就个人而言,我从你给出的信息中做到这一点的唯一原因是内存的使用,以及可能的性能取决于你对这大量的A..Us 做了什么. 如果真的很重要,它既是驱动程序又是约束,你应该转换为ANSI.