【问题标题】:How to convert AnsiString into an Integer in modern Delphi?如何在现代 Delphi 中将 AnsiString 转换为 Integer?
【发布时间】:2013-09-30 19:56:37
【问题描述】:

这与SameText 的问题有点不同。

我需要将AnsiString 转换为Integer

var
  param: AnsiString;
  num: Integer;
begin
  if TryStrToInt(param, num) then
  ...

在 Unicode 之前的 Delphi 中,我会使用 TryStrToInt 函数,但在现代 Delphi 中只有 Unicode 版本,所以我收到以下警告:W1057 Implicit string cast from 'AnsiString' to 'string' on call .

我的问题是,如何在现代 Delphi 中正确转换 AnsiStrings 而不会收到编译器警告(并且不必过多地将字符串转换为 UnicodeString(text))

【问题讨论】:

  • 给你的评论。您不应在代码中使用UnicodeString。标准做法是使用其别名string。并不是TryStrToInt 的声明使用string 而不是UnicodeString。所以显式转换应该是string(param)

标签: string delphi unicode type-conversion


【解决方案1】:

为您提供多种选择:

  1. 接受并接受 Unicode。停止使用AnsiString
  2. 使用到string 的显式转换:TryStrToInt(string(param), num)
  3. 禁用警告 W1057。
  4. 通过调用 MultiByteToWideChar 自行执行从 ANSI 到 UTF-16 的转换。这不是一个严肃的选择,但如果您想启用 W1057,并且不使用显式转换,那么剩下的就是它。

坦率地说,选项 1 是首选。如果您尝试通过代码坚持使用AnsiString,您将陷入无休止的强制转换和警告泥潭。如果您需要 ANSI 编码的字符串,它可能处于互操作边界。也许您正在读取或写入使用 ANSI 编码的文件。在互操作边界处执行 ANSI 和 UTF-16 之间的转换。其余时间,您的内部代码使用string

【讨论】:

  • 我正在使用 AnsiStrings 故意将某些内容与其他 UnicodeStrings 混合分开,以便编译器在错误发生时向我发出警告。由于序列化和向后兼容性,我使用了详细类型。
  • 好的,如果您不能使用 1,并且您必须启用 W1057,那么您正在查看上面的选项 2 或 4。
  • 谢谢。我只是希望在这里得到类似AnsiStrings.SameText 的东西。
  • 您为什么担心转换为 UTF-16。只要您从 ANSI 数据开始,您就可以无损地相互转换。
  • 不,我的意思是如果你在边界转换,那么你只做一次转换。因为您建议多次进行转换。它没有或多或少的错误。
【解决方案2】:

如何在现代 Delphi 中正确转换 AnsiStrings 而不会得到 编译器警告(并且无需将字符串强制转换为 Unicode字符串

如果您不从 AnsiString 转换为 String,编译器会为您执行此操作。你无法避免演员阵容。这只是你显式执行它,还是编译器为你隐式执行它的问题。

当您在代码中显式地进行转换(通过强制转换)时,编译器不会担心副作用。它假定您知道自己在做什么,然后让您一个人呆着。

你必须选择一个。编译器警告或显式转换。

从技术上讲,您可以关闭这些编译器警告(但不要这样做):

W1057 IMPLICIT_STRING_CAST ON 隐式字符串从“%s”转换为 “%s”(德尔福)

W1058 IMPLICIT_STRING_CAST_LOSS ON 隐式字符串转换 从“%s”到“%s”的潜在数据丢失(Delphi)

【讨论】:

  • 另一种解决方案是使用专用的TryStrToIntA 或类似的东西
  • @KromStern,说得好。如果你重复调用一个函数,把它包起来。
  • 实际上,我关闭了W1057,但让W1058 保持打开状态。
猜你喜欢
  • 2014-01-19
  • 2010-09-25
  • 2010-11-20
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
相关资源
最近更新 更多