Delphi TStringHelper未返回正确的结果

Delphi TStringHelper未返回正确的结果,delphi,delphi-xe4,Delphi,Delphi Xe4,我在Win32应用程序中使用的是TStringHelper,但当我尝试访问特定的字符或获取子字符串时,如果使用等效的旧字符串函数,返回的值将不相同 {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; var i : Integer; s : string; begin try i:=12345678; Writeln(i.ToString().Chars[1]); // returns 2 Wri

我在Win32应用程序中使用的是
TStringHelper
,但当我尝试访问特定的字符或获取子字符串时,如果使用等效的旧字符串函数,返回的值将不相同

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  i : Integer;
  s : string;
begin
  try
    i:=12345678;
    Writeln(i.ToString().Chars[1]);  // returns 2
    Writeln(i.ToString().Substring(1)); //returns 2345678

    s:=IntToStr(i);
    Writeln(s[1]); //returns 1
    Writeln(Copy(s,1,Length(s)));//returns 12345678
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
问题是为什么TStringHelper函数不等同于旧的字符串函数?

这些函数是基于0的,而不是基于1的。从
TStringHelper.Chars
emphasis mine)的链接文档中:

访问此零基字符串中的单个字符

从(同样,强调我的)的链接:

从该基于0的字符串中返回从位置StartIndex开始并可选地以位置StartIndex+长度结束的子字符串(如果指定)

Chars
链接中的代码示例还显示了从
0
Length-1
的循环,而不是从
1
Length(string)
的普通
string
循环:


这是因为System.SysUtils.TStringHelper的所有方法和属性都是基于零的索引,此帮助程序是带指令的编译器。您可以在文档中找到更多信息。

首先引入TStringHelper的全部原因是创建基于0的字符串操作,而不破坏与现有代码的向后兼容性。Embarcadero正试图慢慢地将RTL向基于0的字符串处理方向移动。
var
  I: Integer;
  MyString: String;

begin
  MyString := 'This is a string.';

  for I:= 0 to MyString.Length - 1 do  // Note start and end of loop condition
    Write(MyString.Chars[I]);
end.