|310109570629206     |朱弢    |
|310109570629206     |钟韡忆  |
|310109570629206     |蒋珅吉  |
|310109570629206     |汪丽韡  |将数据放入数组中
ssTemp:= TStringList.Create;
ssTemp.Text := replace(trim(strings[j]),'|',#13#10);
 
这时候少数一部分姓名读取出来是乱码(如上,大部分没有问题),将分隔符'|'换成'@'就没有问题。
初步判断应该'|'引起的。有没有办法在保留'|'分隔符的前提下将信息正确的读取出来。
先谢谢了

解决方案 »

  1.   

    1.你用的是什么版本的DELPHI,2009以上的可能是unicode的问题
    2.replace函数是自己写的吗?
      

  2.   

    button1事件
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
    for i :=0 to memo1.Lines.Count-1 do begin
      ExtractStrings(['|'],[' '],pchar(memo1.Lines[i]),memo2.Lines);
    end;
    end;memo1放入的要转换的
    |310109570629206 |朱弢 |
    |310109570629206 |钟韡忆 |
    |310109570629206 |蒋珅吉 |
    |310109570629206 |汪丽韡 |memo2来接收没发现有乱码的 结果如下
    Memo2
    310109570629206 
    朱弢 
    310109570629206 
    钟韡忆 
    310109570629206 
    蒋珅吉 
    310109570629206 
    汪丽韡 
      

  3.   

    可能我们用的delphi 版本不同,我用的是delphi5  Memo2结果如下
    310109570629206     
    朱?
    310109570629206     
    钟?
    忆  
    310109570629206     
      

  4.   

    widestring 转换一下类型,自己一个COPY()拆开吧
      

  5.   

    1.我用的是delphi5 .
    2.replace 函数如下
        function replace(str:string;subStr:string;replaceStr:string):string;
        var i:integer;
        begin
            i:=Pos(subStr,str);
            while i >0 do
                begin
                Delete(str,i,length(subStr));
                Insert(replaceStr,str,i);
                i:=Pos(subStr,str);
                end;
            Result:=str;
        end;
      

  6.   

    既然是固定格式你完全可以忽略分隔符,直接用Copy从中间取出子串来。copy(xxx, 2, 15)就是前面的数字了,后面的姓名一样处理。两个字或者三个字用字符串总长就可以判断。
      

  7.   


    这是你自己写的函数?试试看StringReplace,系统自带的。
      

  8.   

    我在delphi6下用#4的的确有乱码,这样就可以:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s:WideString;
    begin
     s:=memo1.Lines.Text;
     s:=StringReplace(s,'|',#13#10,[rfReplaceAll]);
     Memo2.lines.add(s);
    end;
    看来是ExtractStrings的问题
      

  9.   

    StringReplace,可以先试试这个方法,我说的就和你写的的那个replace一样,只是先把STRING 转成双字节的字符然后再POS
      

  10.   

    另一解决方案:procedure TForm1.Button1Click(Sender: TObject);
    vart:tstringlist;
    begin
     t:=tstringlist.Create;
     t.Delimiter:='|';
     t.DelimitedText:=Memo1.Lines.Text;
     Memo2.lines.AddStrings(t);
     t.Free;
    end;
      

  11.   

    或者把你的函数改成这样:function replace(str:WideString;subStr:string;replaceStr:string):string; 就OK了,哈哈
      

  12.   

    我不清楚你的replace是如何实现的,所以无法判定你的代码有什么问题。
      

  13.   

    跟是否WideString 没有关系。
    s:String;
    begin
    s:=memo1.Lines.Text;
    s:=StringReplace(s,'|',#1……
    也是正确的
      

  14.   

    刚才看了下lz的例子,个人认为:因为汉字是占双字节,恰好'|'字符的ascii码值在你每个名字里面都可能有与'|'字符相同的值 所以在你用replace函数替换的时候不仅仅替换掉本身要替换的'|'字符,而且还把名字中与'|'字符ascii码相等的字节替换掉了(因为你这里定义为string类型,pos的时候就按照单字节去搜索,1个汉字就会比对2次)。
      

  15.   

    pos
    *****************************************************************************
    Pos searches for Substr within S and returns an integer value that is the index of the first character of Substr within S. Pos is case-sensitive. If Substr is not found, Pos returns zero
    AnsiStrPos
    ****************************************************************************
    Call AnsiStrPos to locate the first occurrence of SubStr in Str. If SubStr does not occur in Str, AnsiStrPos returns nil.
    Unlike the StrPos function, AnsiStrPos works with multi-byte characters sets (MBCS).
    之所以replce不行,而StringReplace可以最终归结到pos 和 AnsiStrPos函数的区别
    MBCS就是多字节字符集,某些字符只用一个字节表示,而另外的一些字符就用多于一个字节的数据来表示。 
    肯能 就是AnsiStrPos能辨别哪些字符是单字节,哪些字符是双字节。但是pos就不能一律采取单字节来操作地。