我必须将大型遗留应用程序转换为 Delphi 2009,它到处使用字符串、AnsiStrings、WideStrings 和 UTF8 数据,而且我很难理解新字符串类型的工作原理以及应如何使用它们。
该应用程序使用 TntUnicodeControls 完全支持 Unicode,并且存在需要特定编码(主要是 UTF8 和 UTF16)的字符串的第 3 方 DLL,这使得转换任务并不像人们想象的那么简单。
我在 C DLL 调用和选择正确类型方面尤其遇到问题。 我还觉得发生了许多隐式字符串转换,因为其中一个 DLL 似乎总是接收 UTF-8 编码的字符串,无论 Delphi 字符串是如何编码的。
有人可以提供有关新的 Delphi 2009 字符串类型 UnicodeString 和 RawByteString 的简短概述,或许还有一些使用提示以及转换 2009 之前的应用程序时可能出现的陷阱吗?
最佳答案
参见Delphi and Unicode ,Marco Cantù 撰写的白皮书,我猜 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。在代码实际编译并正常运行后,您可以重构代码以使用 string
(UnicodeString
)。
关于delphi - 新的字符串类型在 Delphi 2009/2010 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399395/