就我的目的而言,我实际上使用的是ASCII字符数据(用于向州提交ASCII文本文件),所以仅使用unicodestring对最终结果没有帮助(我仍然需要转换一些内容)。
在Delphi2009中,我可以选择将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))));我记得马尔科·坎图说过,不要在循环中做这些,我只是不记得是哪一个或者为什么。
发布于 2011-10-14 13:44:18
如果编译以下代码:
StrComp(PAnsiChar(Mask.EditText), Val);有一个从Mask.EditText as UnicodeString到临时AnsiString的隐式转换,以便允许将类型转换为PAnsiChar。这是你的第二行:
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);但是写作
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));将让PChar(MAskEdit.EditText)返回一个PChar,也就是一个PWideChar,因此它将使用另一个重载的StrComp函数。
事实上,自Delphi2009以来,在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调用)相比,使用unicode而不是AnsiChar (即拥有两倍的内存)的问题无关紧要。引用你的标题,转换方向并不重要:它总是比没有转换慢得多。
如果你搜索一下速度,我怀疑Mask.EditText绝对是你代码中的瓶颈。此方法将发送一条GDI消息,等待组件的响应,然后使用文本影响string。如果像我怀疑的那样,在循环中使用这个Mask.EditText表达式,那么最好在堆栈上使用临时变量。
发布于 2011-10-14 06:26:35
真正的问题是-为什么要将UnicodeString与PAnsiChar进行比较,而不是将PAnsiChar数据更新为Unicode?您应该在与遗留数据、网络连接等交互的边界使用AnsiChar/AnsiString。所有内部处理都应该使用单个字符串编码,以避免此类问题。加载数据时,将旧版/网络数据从Ansi转换为Unicode。在保存遗留数据、发送网络数据等时,从Unicode转换为Ansi。
https://stackoverflow.com/questions/7758617
复制相似问题