我在 2009 年重新编译一些在不同点使用宽字符串的应用程序时遇到了一些奇怪的行为。
在 Delphi 2009 应用程序中 Widestring 与 String 相同吗?
我在 2009 年重新编译一些在不同点使用宽字符串的应用程序时遇到了一些奇怪的行为。
在 Delphi 2009 应用程序中 Widestring 与 String 相同吗?
不,它们不相同。
WideString
只是 ActiveX/COMBSTR
类型的包装器。在 ActiveX/COM 中处理字符串时需要它。
String
在 Delphi 2009 及更高版本中是 . 的别名UnicodeString
,它可以包含 Unicode 字符,BSTR
就像WideString
. WideString
由 COM 内存管理器分配,不计入引用。 UnicodeString
由 RTL 内存管理器分配,并且是引用计数的,就像AnsiString
is。
您应该(Unicode)String
尽可能使用,并且仅WideString
用于 COM 互操作,或处理WideString
用于 Unicode 支持的遗留库。
似乎答案就在这里:
Delphi 2009 中最显着的变化是“string”类型现在是 UnicodeString 而不是 AnsiString 的别名。
另一件需要注意的重要事情是性能差异。
在 Marco Cantu 的白皮书中(在 moodforaday 的回答中提到)说:
“WideString 过去(现在仍然)没有引用计数,并且在性能和灵活性方面极差(例如,它使用 Windows 全局内存分配器而不是本机 FastMM4)。”
我见过的几乎所有 Delphi 2009 升级指南都建议您将所有 WideStrings 转换为字符串。
请参阅 Marco Cantu 的这篇论文,其中概述了 Delphi 2009 中字符串(即 UnicodeString)的工作原理:
“白皮书:Delphi 和 Unicode”
http://dn.codegear.com/article/38980
基本上,这就是罗迪所说的,但需要 27 页才能详细说明。