在现代Delphi中如何将AnsiString转换成整数?

在现代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

这与SameText问题有点不同

我需要将
AnsiString
转换为
整数

var
  param: AnsiString;
  num: Integer;
begin
  if TryStrToInt(param, num) then
  ...
在Unicode之前的Delphi中,我会使用
TryStrToInt
函数,但在现代Delphi中,它只有Unicode版本,因此我得到了以下警告:W1057隐式字符串在调用时从“AnsiString”转换为“string”


我的问题是,如何在现代Delphi中正确转换ansistring而不获得编译器警告(并且不必将字符串强制转换为UnicodeString(文本))

您可以使用各种选项:

  • 接受并接受Unicode。停止使用
    AnsiString
  • 使用显式转换到
    string
    TryStrToInt(string(param),num)
  • 禁用警告W1057
  • 通过调用
    MultiByteToWideChar
    自己执行从ANSI到UTF-16的转换。这不是一个严肃的选项,但是如果您想保持W1057的启用状态,而不使用显式转换,那么剩下的就是它
  • 坦率地说,选择1是可取的。如果你试图通过你的代码持续使用
    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
    打开。