Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 编译器指令使字符串UnicodeString_Delphi - Fatal编程技术网

Delphi 编译器指令使字符串UnicodeString

Delphi 编译器指令使字符串UnicodeString,delphi,Delphi,在Delphi 2009及更高版本中,字符串类型隐式地等于UnicodeString类型。我现在的原则是对我最近的基本单位使用显式的破坏类型来消除混乱。是否有一个编译器指令可以使字符串在声明的单元中进行UnicodeString?不幸的是,答案是否定的。没有编译器开关 不幸的是,答案是否定的。没有编译器开关 那么,您根本不想使用字符串?还是将其还原为AnsiString 这两件事都可以通过黑客实现,但真正的答案是:不要这样做。那么,你根本不想使用字符串?还是将其还原为AnsiString 好吧,

在Delphi 2009及更高版本中,字符串类型隐式地等于UnicodeString类型。我现在的原则是对我最近的基本单位使用显式的破坏类型来消除混乱。是否有一个编译器指令可以使字符串在声明的单元中进行UnicodeString?

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

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

那么,您根本不想使用字符串?还是将其还原为AnsiString


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

那么,你根本不想使用字符串?还是将其还原为AnsiString


好吧,这两件事都可以通过黑客实现,但真正的答案是:不要这样做。

如果你想拥有一个可以在Unicode和非Unicode Delphi下编译的代码库,你应该知道每次出现字符串时的用法——它是传递给Windows API的字符串吗?您是要调用“Delphi本机”版本,还是要显式调用Ansi版本或Wide版本?它是与RTL/VCL代码交换的字符串吗?它是来自数据库的字符串吗?它是否需要支持Unicode、Ansi或任何其他编码?等等

根据我的经验,与Windows.pas中声明的Delphi RTL/VCL和WinAPI交互的代码最好使用字符串本身,因为它透明地意味着AnsiString或UnicodeString,具体取决于所使用的编译器。如果字符串的特定用途使得Ansi或Unicode之间的区别非常重要,请显式使用AnsiSting或UnicodeString。这就给旧的Delphi带来了一个问题,因为它们没有Unicode解构。在实践中,这可以通过在一些中央单元中定义一个解压单元来很大程度上解决:

{$IF NOT DECLARED(UnicodeString)}
type UnicodeString = WideString;
{$IFEND}
另一方面,如果您希望您的代码可以配置为使用Ansi或Unicode,请尽可能多地使用您自己的字符串类型。定义如下:

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

。。如果你想拥有一个可以在Unicode和非Unicode Delphi下编译的代码库,你应该知道每一个字符串的用法——它是传递给Windows API的字符串吗?您是要调用“Delphi本机”版本,还是要显式调用Ansi版本或Wide版本?它是与RTL/VCL代码交换的字符串吗?它是来自数据库的字符串吗?它是否需要支持Unicode、Ansi或任何其他编码?等等

根据我的经验,与Windows.pas中声明的Delphi RTL/VCL和WinAPI交互的代码最好使用字符串本身,因为它透明地意味着AnsiString或UnicodeString,具体取决于所使用的编译器。如果字符串的特定用途使得Ansi或Unicode之间的区别非常重要,请显式使用AnsiSting或UnicodeString。这就给旧的Delphi带来了一个问题,因为它们没有Unicode解构。在实践中,这可以通过在一些中央单元中定义一个解压单元来很大程度上解决:

{$IF NOT DECLARED(UnicodeString)}
type UnicodeString = WideString;
{$IFEND}
另一方面,如果您希望您的代码可以配置为使用Ansi或Unicode,请尽可能多地使用您自己的字符串类型。定义如下:

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

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

自D2009发布以来,Embarcadero论坛反复提出并详细讨论了这个问题。这个问题反复提出并详细讨论,在D2009发布后的Embarcadero论坛上,我的旧代码仍然是ansi代码,需要进行一些修改才能在Unicode中使用。在Delphi2009中,字符串等于UnicodeString的含义并不意味着它可以保证我的旧代码在Delphi2009中完美地工作。正因为如此。我不知道如何进一步解释我的想法,但这是我现在开始使用显式Unicode Destring的原因之一。我需要编译器的帮助来警告我。我不明白你们的情况是什么,但我觉得你们做错了什么。对于字符串误用,编译器会发出警告。对于仍然是ansi的旧代码,需要对其进行一些修改,以便在Unicode中使用。在Delphi2009中,字符串等于UnicodeString的含义并不意味着它可以保证我的旧代码在Delphi2009中完美地工作。正因为如此。我不知道如何进一步解释我的想法,但这是我现在开始使用显式Unicode Destring的原因之一。我需要编译器的帮助来警告我。我不明白你们的情况是什么,但我觉得你们做错了什么。有编译器警告字符串误用。谢谢,非常感谢您的帮助:-谢谢,我非常感谢你的帮助-