就我的目的而言,我实际上真正使用的是 ASCII 字符数据(用于向州提交 ASCII 文本文件),因此仅使用 unicodestring 对最终结果没有帮助(我仍然需要转换一些内容)。
我可以选择在 Delphi 2009 中转换 StrComp 函数,该函数从比较 AnsiString 和 PAnsiChar 到比较 UnicodeString 和 PAnsiChar。
Val : PAnsiChar
Mask : TEditMask;
...
这是我原来的代码,不太好
StrComp(PAnsiChar(Mask.EditText), Val);
...
所以,我可以将其更改为:
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);
或者,我可以将其更改为这样(“清晰度”的额外转换):
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));
我记得 Marco Cantu 说过,不要循环执行其中一项,我只是不记得是哪一项或为什么。
最佳答案
如果你编译这个:
StrComp(PAnsiChar(Mask.EditText), Val);
存在从 Mask.EditText
作为 UnicodeString
到临时 AnsiString
的隐式转换,以便允许类型转换为 PAnsiChar
。这是你的第二行:
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);
但是写
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));
会让PChar(MAskEdit.EditText)
返回一个PChar
,即一个PWideChar
,因此它将使用另一个重载的StrComp
函数。
事实上,自 Delphi 2009 以来,SysUtils.pas 中定义了两个重载函数:
function StrComp(const Str1, Str2: PAnsiChar): Integer; overload;
function StrComp(const Str1, Str2: PWideChar): Integer; overload;
这两个函数都不会调用windows API,而是会一一比较字符,区分大小写。
所以我的建议是,您只需在代码中不要使用任何指针,而在代码中的任何地方都依赖于普通的 string
= UnicodeString
变量,并使用此函数相反:
function CompareStr(const S1, S2: string): Integer;
比较将是相同的,并且不会有隐藏转换。与 unicode 和当前 ansi 页面之间的转换(两次 WinAPI 调用)相比,使用 WideChar
而不是 AnsiChar
(即拥有两倍的内存)的问题根本不算什么。引用你的标题,转化方向并不重要:它总是比没有转化慢得多。
如果您搜索速度,我怀疑 Mask.EditText
绝对是代码中的瓶颈。此方法将发送一条 GDI 消息,等待组件的响应,然后影响带有文本的字符串
。如果(正如我怀疑的那样)您在循环中使用此 Mask.EditText
表达式,您最好在堆栈上使用临时变量。
关于delphi - 哪个受到的打击最大 : AnsiString to String or String to AnsiString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758617/