String Delphi Pos始终返回0

String Delphi Pos始终返回0,string,web-services,delphi,indy,String,Web Services,Delphi,Indy,我真的不知道为什么Pos总是返回0而不是字符串中的字符“;”位置 我必须得到一个php页面的响应,该页面输出一个内容类型:text/plain 因此,一个示例输出是 2;富拉诺;富拉诺;0 3.西克拉诺;西克拉诺;0 4.贝尔特拉诺;贝尔特拉诺;0 5.傅;傅;0 8.何塞;何塞;0 9;玛丽亚;玛丽亚;0 代码是 var linha,uid,login,senha,email,tipo : WideString; resposta : TStringList; I : Intege

我真的不知道为什么Pos总是返回0而不是字符串中的字符“;”位置 我必须得到一个php页面的响应,该页面输出一个内容类型:text/plain 因此,一个示例输出是
2;富拉诺;富拉诺;0
3.西克拉诺;西克拉诺;0
4.贝尔特拉诺;贝尔特拉诺;0
5.傅;傅;0
8.何塞;何塞;0
9;玛丽亚;玛丽亚;0

代码是

var
  linha,uid,login,senha,email,tipo : WideString;
  resposta : TStringList;
  I : Integer;
begin
  try
    resposta := TStringList.Create;
    resposta.Text := frmMain.IdHTTP1.Get(frmMain.cdsConfig.FieldByName('WebService').AsString+'listdest.php');
    for I := 0 to resposta.Count-1 do
    begin
      linha := resposta.Strings[i];
      if i = 0 then
        Delete(linha,1,1); // the first line have one wierd $FEFF
      if length(linha) > 5 then
        begin

          uid := Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          login:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          senha:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          email:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
          tipo:=Copy(linha,1,Pos(linha,';')-1);
          Delete(linha,1,Pos(linha,';'));
        end;
    end;
    //dlgWait.Close;
  except on E :Exception do
    begin
      MessageBox(Self.Handle,PWideChar(E.Message),'Erro',MB_OK+MB_ICONERROR+MB_APPLMODAL);
      dlgWait.Close;
      FreeAndNil(resposta);
    end;
  end;

您对
Pos
的呼叫是反向的。参数包括:

function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
但您的代码假定它们是:

function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;
所以实际上它要做的是在
中查找
linha
的值;',当然,除非linha
,它将返回
0

另一种说法是,正如Rudy所说,代码不是在大海捞针,而是在大海捞针

交换这些调用的第一个和第二个参数


顺便说一句,这只是一个性能提示。与其每次调用
Pos
两次,不如保留该值的缓存副本

P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);

您对
Pos
的呼叫是反向的。参数包括:

function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
但您的代码假定它们是:

function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;
所以实际上它要做的是在
中查找
linha
的值;',当然,除非linha
,它将返回
0

另一种说法是,正如Rudy所说,代码不是在大海捞针,而是在大海捞针

交换这些调用的第一个和第二个参数


顺便说一句,这只是一个性能提示。与其每次调用
Pos
两次,不如保留该值的缓存副本

P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);

我通常使用
Pos(针、草垛)。这样一个愚蠢的错误,这些是很难找到的。谢谢大家。更好的性能是使用
Pos()
Offset
参数,并且不删除左侧
linha
内容。我通常使用
Pos(针、草垛)。这样一个愚蠢的错误,这些是很难找到的。谢谢大家,更好的性能是使用
Pos()
Offset
参数,并且不删除左侧的
linha
内容。在这种情况下,我将使用
TStringList
解析行,而不是使用
Pos()
。设置
TStringList.Delimiter=';'
TStringList.StrictDelimiter=True
,然后设置
TStringList.DelimitedText=linha
。或者,使用Indy的
Fetch()
SplitDelimitedString()
函数(因为问题被标记为“Indy”)。仅供参考,“第一行有一个wierd$FEFF”意味着文本前面有一个UTF-16 BOM表,这对于Web服务器来说有点奇怪,而不是依赖HTTP
内容类型
头来携带字符集信息。@Remy我想这取决于需要解析多少项。在这里,似乎每次都会有4个,所以我认为在所有意义上都是安全的,更快的手动解析它。但是,如果有很多(比如20+),或者数量可变(未知),那么肯定是的,一个
TStringList
会非常有效。但是对于4个值,我认为
TStringList
对于这项任务来说有点太重了。@Jerrydoge:在使用
Pos()
之前,我会选择使用
TStringList
来解析行,而不是使用
Pos()
。设置
TStringList.Delimiter=';'
TStringList.StrictDelimiter=True
,然后设置
TStringList.DelimitedText=linha
。或者,使用Indy的
Fetch()
SplitDelimitedString()
函数(因为问题被标记为“Indy”)。仅供参考,“第一行有一个wierd$FEFF”意味着文本前面有一个UTF-16 BOM表,这对于Web服务器来说有点奇怪,而不是依赖HTTP
内容类型
头来携带字符集信息。@Remy我想这取决于需要解析多少项。在这里,似乎每次都会有4个,所以我认为在所有意义上都是安全的,更快的手动解析它。但是,如果有很多(比如20+),或者数量可变(未知),那么肯定是的,一个
TStringList
会非常有效。但是对于4个值,我认为
TStringList
对于这个任务来说有点太重了。@Jerrydoge:在使用
Pos()
之前,我更愿意选择使用
Fetch()