就我的目的而言,我实际上是真正使用ASCII字符数据(用于将ASCII文本文件提交到状态),所以仅使用unicodestring将无法帮助最终结果(我仍然需要转换某些东西)。 / p>
我可以选择在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说,不要在循环中做其中一个,我只是不记得是哪一个或为什么。
答案 0 :(得分:5)
如果你编译它:
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消息,等待组件的响应,然后使用文本影响string
。你最好在堆栈上使用临时变量,如果我怀疑你在循环中使用这个Mask.EditText
表达式。
答案 1 :(得分:2)
真正的问题是 - 为什么要将UnicodeString
与PAnsiChar
进行比较,而不是将PAnsiChar
数据更新为Unicode?您应该在与遗留数据,网络连接等交互的边界处使用AnsiChar / AnsiString。所有内部处理应该使用单个字符串编码来避免这些类型的问题。加载数据时,将传统/网络数据从Ansi转换为Unicode。保存旧数据,发送网络数据等时,从Unicode转换为Ansi