在现代Delphi中如何将AnsiString转换成整数?
这与SameText问题有点不同 我需要将在现代Delphi中如何将AnsiString转换成整数?,string,delphi,unicode,type-conversion,String,Delphi,Unicode,Type Conversion,这与SameText问题有点不同 我需要将AnsiString转换为整数 var param: AnsiString; num: Integer; begin if TryStrToInt(param, num) then ... 在Unicode之前的Delphi中,我会使用TryStrToInt函数,但在现代Delphi中,它只有Unicode版本,因此我得到了以下警告:W1057隐式字符串在调用时从“AnsiString”转换为“string” 我的问题是,如何在现代De
AnsiString
转换为整数
var
param: AnsiString;
num: Integer;
begin
if TryStrToInt(param, num) then
...
在Unicode之前的Delphi中,我会使用TryStrToInt
函数,但在现代Delphi中,它只有Unicode版本,因此我得到了以下警告:W1057隐式字符串在调用时从“AnsiString”转换为“string”
我的问题是,如何在现代Delphi中正确转换ansistring而不获得编译器警告(并且不必将字符串强制转换为UnicodeString(文本))您可以使用各种选项:
AnsiString
李>
string
:TryStrToInt(string(param),num)
MultiByteToWideChar
自己执行从ANSI到UTF-16的转换。这不是一个严肃的选项,但是如果您想保持W1057的启用状态,而不使用显式转换,那么剩下的就是它ansisting
,你将陷入无尽的施放和警告的泥潭。如果您需要ANSI编码的字符串,它可能位于互操作边界。可能您正在读取或写入使用ANSI编码的文件。在互操作边界处执行ANSI和UTF-16之间的转换。其余时间,对于内部代码,请使用string
如何在现代Delphi中正确转换ansistring而不需要
编译器警告(并且无需将字符串强制转换为
破坏
如果您不从ansisting转换为String,编译器将为您执行转换。您无法避免转换。这只是您显式执行转换或编译器隐式执行转换的问题
当您在代码中显式地进行转换(通过cast)时,编译器就不必担心副作用。它假定您知道自己在做什么,并且不必理会您
您必须选择一个。编译器警告或显式强制转换
您可以从技术上关闭这些编译器警告(但不要这样做):
W1057隐式字符串\u对从“%s”到的隐式字符串强制转换
“%s”(德尔福)
W1058隐式字符串强制转换的损失
从“%s”到“%s”的潜在数据丢失(Delphi)
给你一条评论。你不应该在你的代码中使用
UnicodeString
。标准做法是使用它的别名string
。TryStrToInt
的声明使用string
而不是UnicodeString
。因此显式转换应该是string(param)
。我使用ansistring来区分某些内容与其他UnicodeStrings的故意混合,以便编译器在错误发生时向我发出警告。我使用的是详细类型,因为序列化和Backwrad兼容。好的,如果您不能使用1,并且必须启用W1057,那么您将看到选项2或4以上。谢谢。我只是希望得到类似的AnsiStrings.SameText
之类的东西。你为什么要担心转换为UTF-16。只要你从ANSI数据开始,你就可以无损地进行转换。不,我的意思是,如果你在边界转换,那么你只需要做一次转换。a您建议多次进行转换。它没有多少问题。另一种解决方案是使用专用的TryStrToIntA
或类似的东西perhaps@KromStern,很好。如果您重复调用一个函数,请将其结束。实际上,我关闭了W1057
,但保持W1058
打开。