2

这与问题有点不同SameText

我需要转换AnsiStringInteger.

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

4

2 回答 2

7

您可以使用各种选项:

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

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

于 2013-09-25T09:41:58.837 回答
0

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

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

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

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

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

W1057 IMPLICIT_STRING_CAST ON 从“%s”到“%s”的隐式字符串转换 (Delphi)

W1058 IMPLICIT_STRING_CAST_LOSS ON 隐式字符串强制转换,可能会丢失从“%s”到“%s”的数据 (Delphi)

于 2013-09-25T13:53:33.307 回答