如何在现代Delphi中将AnsiString转换为Integer?

时间:2013-09-25 09:36:43

标签: string delphi unicode type-conversion

这与SameText问题略有不同。

我需要将AnsiString转换为Integer

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

在Unicode之前的Delphi中我会使用TryStrToInt函数,但在现代Delphi中只有它的Unicode版本,所以我收到了这个警告:W1057从'AnsiString'到'string'的隐式字符串转换随叫随到。

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

2 个答案:

答案 0 :(得分:7)

您可以使用各种选项:

  1. 接受并接受Unicode。停止使用AnsiString
  2. 使用显式转换为stringTryStrToInt(string(param), num)
  3. 禁用警告W1057。
  4. 通过调用MultiByteToWideChar自行执行从ANSI到UTF-16的转换。这不是一个严肃的选择,但如果你想让W1057启用,而不是使用显式转换,那么它就是剩下的。
  5. 坦率地说,选项1是首选。如果你试图在你的代码中坚持使用AnsiString,那么你将陷入无休止的演员阵容和警告之中。如果您需要ANSI编码的字符串,则可能处于互操作边界。也许您正在阅读或编写使用ANSI编码的文件。在互操作边界处执行ANSI和UTF-16之间的转换。其余时间,对于您的内部代码,请使用string

答案 1 :(得分:0)

  

如何在现代Delphi中正确转换AnsiStrings而不必获取   编译器警告(并且没有多余的必须将字符串转换为   的UnicodeString

如果你没有从AnsiString转换为String,编译器会为你做。你无法避免演员表演。如果您明确地执行此操作,或者编译器会隐式执行此操作,那么这只是一个问题。

当您在代码中显式执行转换(通过强制转换)时,编译器不会担心副作用。它假设你知道你正在做什么,让你独自一人。

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

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

  

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

     

W1058 IMPLICIT_STRING_CAST_LOSS使用隐式字符串转换   潜在数据从'%s'丢失到'%s'(德尔福)