首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个受到最大的打击: AnsiString to String还是String to AnsiString?

哪个受到最大的打击: AnsiString to String还是String to AnsiString?
EN

Stack Overflow用户
提问于 2011-10-14 02:19:54
回答 2查看 1.6K关注 0票数 1

就我的目的而言,我实际上使用的是ASCII字符数据(用于向州提交ASCII文本文件),所以仅使用unicodestring对最终结果没有帮助(我仍然需要转换一些内容)。

在Delphi2009中,我可以选择将StrComp函数从比较AnsiString和PAnsiChar转换为UnicodeString和PAnsiChar。

代码语言:javascript
复制
Val : PAnsiChar
Mask : TEditMask;

……

这是我的原始代码,它不好

代码语言:javascript
复制
StrComp(PAnsiChar(Mask.EditText), Val);

……

因此,我可以将其更改为:

代码语言:javascript
复制
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);

或者,我可以把它改成这样(为了“清晰”,额外的转换):

代码语言:javascript
复制
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));

我记得马尔科·坎图说过,不要在循环中做这些,我只是不记得是哪一个或者为什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-14 13:44:18

如果编译以下代码:

代码语言:javascript
复制
StrComp(PAnsiChar(Mask.EditText), Val);

有一个从Mask.EditText as UnicodeString到临时AnsiString的隐式转换,以便允许将类型转换为PAnsiChar。这是你的第二行:

代码语言:javascript
复制
StrComp(PAnsiChar(AnsiString(MAskEdit.EditText), Val);

但是写作

代码语言:javascript
复制
StrComp(PChar(MAskEdit.EditText), PChar(String(AnsiString(Val))));

将让PChar(MAskEdit.EditText)返回一个PChar,也就是一个PWideChar,因此它将使用另一个重载的StrComp函数。

事实上,自Delphi2009以来,在SysUtils.pas中定义了两个重载函数:

代码语言:javascript
复制
function StrComp(const Str1, Str2: PAnsiChar): Integer; overload;
function StrComp(const Str1, Str2: PWideChar): Integer; overload;

这两个函数都不会调用windows API,但会逐个比较字符,区分大小写。

因此,我的建议是,您只需在代码中不使用任何指针,而是在代码中到处依赖普通的string = UnicodeString变量,并使用以下函数:

代码语言:javascript
复制
function CompareStr(const S1, S2: string): Integer;

比较将是相同的,并且不会有隐藏的转换。与unicode和当前ansi页面之间的转换(两次WinAPI调用)相比,使用unicode而不是AnsiChar (即拥有两倍的内存)的问题无关紧要。引用你的标题,转换方向并不重要:它总是比没有转换慢得多。

如果你搜索一下速度,我怀疑Mask.EditText绝对是你代码中的瓶颈。此方法将发送一条GDI消息,等待组件的响应,然后使用文本影响string。如果像我怀疑的那样,在循环中使用这个Mask.EditText表达式,那么最好在堆栈上使用临时变量。

票数 5
EN

Stack Overflow用户

发布于 2011-10-14 06:26:35

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7758617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档