我特别遇到了C DLL调用的问题,选择正确的类型也很麻烦。我也发现有很多隐式的字符串转换,因为其中一个DLL似乎总是接收UTF-8编码的字符串,无论Delphi字符串的编码方式如何。
请问有人可以提供一份关于新的Delphi 2009字符串类型——UnicodeString和RawByteString的简要概述,可能会有一些使用提示和在转换pre 2009应用程序时可能遇到的问题吗?
请查看由Marco Cantù撰写的白皮书Delphi和Unicode,以及我猜是Joel所写的每个软件开发人员都必须绝对、肯定地了解Unicode和字符集的最低限度(没有任何借口!)。
一个陷阱是,默认的Win32 API调用已被映射为使用W(宽字符串)版本,而不是A(ANSI)版本,例如ShellExecuteA
。如果您的代码正在做内部布局假设AnsiString
的棘手指针代码,那么它将会中断。一种备选方案是将PChar
替换为PAnsiChar
,Char
替换为AnsiChar
,string
替换为AnsiString
,并在Win32 API调用的这部分代码末尾添加A。在代码实际编译和正常运行之后,您可以重构您的代码,使用string
(UnicodeString
)。
本周五,您可以观看我的CodeRage 4关于“在程序中使用Unicode和其他编码”的演讲,或等待在线回放。
我将介绍一些编码并解释字符串格式。
幻灯片即将上线(我会尽快在网上发布),其中包含许多参考资料,您应该在互联网上阅读(但我必须承认我忘记了eed3si9n发布的有关Unicode的Joel链接)。
今天我会编辑这个答案并上传链接。
编辑:
如果您有一个小样例,可以展示您的C / C ++ DLL接收到UTF8编码的字符串,但认为它们应该以其他方式编码,请将其发布(给我发电子邮件;几乎任何@符号之前都可以通过我的名字来找到我)。
现在可以下载会议材料,包括“在程序中使用Unicode和其他编码”会话。
以下是该会话的链接:
请阅读以下内容:
相关的在线帮助主题:
希望这些内容能够帮助您。如果还有问题,请发送邮件给我,我会尽力在此处扩展答案。
似乎我所有的问题都来自于赋值时的自动转换为UTF8String
。
我已经有了使用UTF8String
的旧代码,只是为了帮助我思考变量应该包含哪种类型的字符串。
在开始移植我的应用程序时,出于同样的原因,我将AnsiString
替换为UTF8String
,但是代码依赖于UTF8String
仅仅是(classic)AnsiString
的别名。
现在,由于自动转换,这个假设不再成立,这就造成了许多问题。
如果您从2009年之前的Delphi代码移植时使用UTF8String
,请小心!