下面兩個函數均是對於一個字符串將其以某個分割符分開:
function SplitStrToArray(const tString, tSplit: String): TStringList;
//以後成為方法1,這也是《Delphi超級猛料》中提到的算法
var
t_Str, t_Item: WideString;
t_Index, t_Len: Integer;
t_StrList: TStringList;
begin
t_StrList := TStringList.Create();
t_Str := tString;
t_Len := Length(tString);
t_Index := pos(tSplit, t_Str); //語句1
if t_Index > 0 then
begin
while t_Index > 0 do
begin
t_Item := LeftStr(t_Str, t_Index - 1);
t_Str := MidStr(t_Str, t_Index + 1, t_Len);
t_Index := Pos(tSplit, t_Str);
if Length(t_Item) > 0 then
t_StrList.Add(t_Item);
end;
end;
if Length(t_Str) > 0 then
t_StrList.Add(t_Str);
Result := t_StrList;
end;
function SplitString(const source,ch:string):TStringList;
//以後成為方法2;
var
temp:string;
i:integer;
begin
result:=tstringlist.Create;
temp:=source;
i:=pos(ch,source);
while i<>0 do
begin
result.Add(copy(temp,0,i-1));
delete(temp,1,i);
i:=pos(ch,temp);
end;
result.Add(temp);
end;
看上去兩段代碼都沒有問題,然而,實際用這兩段進行測試時:比如:
s:='美國a,aab,中國,ddf';
t:=SplitStrToArray(s,',');
//t:=SplitString(s,',');
for i:=0 to t.Count-1 do
showmessage(t.Strings[i]);
會發現方法1不能識別中文,也就是說在有中文的字符串裡面,方法一不能正確分割。而方法2可以。問題出現在哪裡呢?
我又跟蹤程序發現,兩個函數在進入循環之前都執行了一個pos( )函數,而方法1此時返回的值是4,方法2返回的就是6,所以方法1自然不能正確識別了。那麼問題又來了,在他們的pos之前,兩個函數都沒有做什麼奇怪的操作啊。
再嘗試,將方法1的 語句1,即t_Index := pos(tSplit, t_Str);的pos的第二個參數修改為函數的形參tString,那麼,此句t_Index的值就是正確的6,而以後的分割又錯了。
我實在是想不通了,不知道哪位達人遇到過類似的問題,還是說我分析的不對,還是Delphi的bug?