用于生成字符串<>的编译器指令的UnicodeString

时间:2010-09-08 18:02:59

标签: delphi

在Delphi 2009及更高版本中,字符串类型隐式等于UnicodeString类型。我现在的学科是为我最近的基本单位使用显式的UnicodeString类型来消除混淆。是否有编译器指令将使字符串<> UnicodeString在声明的单位?

3 个答案:

答案 0 :(得分:5)

不幸的是,答案是否定的。没有编译器开关。

答案 1 :(得分:2)

如果你想拥有一个可以在Unicode和非Unicode Delphi下编译的代码库,你应该知道string每次出现的用法 - 它是否是一个传递给Windows API的字符串?你想调用'Delphi native'版本,还是想明确调用Ansi版本或Wide版本?它是用RTL / VCL代码交换的字符串吗?它是数据库中的字符串吗?是否需要支持Unicode,Ansi或任何其他编码?等

根据我的经验,与Delphi RTL / VCL和WinAPI交互的代码(在Windows.pas等中声明)最好与string本身一起提供,因为它透明地表示AnsiString或UnicodeString,具体取决于编译器正在使用。如果字符串的特定用途使Ansi或Unicode的区别很重要,请明确使用AnsiSting或UnicodeString。这引入了旧版Delphi的问题,因为它们没有 UnicodeString。在实践中,通过在某个中央单元中自己定义UncodeString可以解决这个问题:

{$IF NOT DECLARED(UnicodeString)}
type UnicodeString = WideString;
{$IFEND}

另一方面,如果您希望您的代码可配置为使用Ansi或Unicode,请尽可能频繁地使用您自己的字符串类型。定义如下:

{$IFDEF MY_APP_USE_UNICODE}
type AppString = UnicodeString;
{$ELSE}
type AppString = AnsiString;
{$ENDIF}

..并在您自己的代码中使用它。

答案 2 :(得分:0)

那么,你根本不想使用String?或者将其还原为AnsiString?

嗯,这两件事都可以通过黑客攻击,但真正的答案是:不要做。