最受欢迎的是:AnsiString为String或String为AnsiString?

时间:2011-10-13 18:19:54

标签: delphi unicode delphi-2009

就我的目的而言,我实际上是真正使用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说,不要在循环中做其中一个,我只是不记得是哪一个或为什么。

2 个答案:

答案 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)

真正的问题是 - 为什么要将UnicodeStringPAnsiChar进行比较,而不是将PAnsiChar数据更新为Unicode?您应该在与遗留数据,网络连接等交互的边界处使用AnsiChar / AnsiString。所有内部处理应该使用单个字符串编码来避免这些类型的问题。加载数据时,将传统/网络数据从Ansi转换为Unicode。保存旧数据,发送网络数据等时,从Unicode转换为Ansi

相关问题