如何解决呢??

解决方案 »

  1.   

    是什么样乱码?也许是BASE64码吧? INDY有相应解码的组件。另外,好象INDY有例子。
      

  2.   

    转帖:function CheckTxt(s: string): string;
    var
    s1,s2,s3: integer;
    t,v: string;
    Encoding: char;
    hex,step: integer;
    a1: array[1..4] of byte;
    b1: array[1..3] of byte;
    j: integer;
    byte_ptr,real_bytes: integer;
    begin
    s1:=Pos('=?',s);
    s2:= 1 ;
    hex:= 0 ;
    if s1>0 then
    begin
    for s2:=Length(s)-1 downto 1 do
    begin
    if Copy(s,s2,2)='?=' then Break;
    end;
    end;
    if (s1=0) or (s2=1) then
    begin
    Result:=s;
    Exit;
    end;
    t:=Copy(s,s1+2,s2-2-s1);
    s3:=Pos('?',t);Delete(t,1,s3);
    if(t='')then
    begin
    Result:= s;
    Exit ;
    end ;
    Encoding:=t[1];
    Delete(t,1,2);
    v:='';
    step:=0;
    case Encoding of
    'Q':
    while t<>'' do
    begin
    case step of
    0:
    begin
    case t[1] of
    '_': v:=v+' ';
    '=': step:=1;
    else v:=v+t[1];
    end;
    end;
    1:
    begin
    if t[1]<='9' then hex:=(Ord(t[1])-Ord('0'))*16
    else hex:=(Ord(t[1])-55)*16;
    step:=2;
    end;
    2:
    begin
    if t[1]<='9' then hex:=hex+(Ord(t[1])-Ord('0'))
    else hex:=hex+Ord(t[1])-55;
    v:=v+Chr(hex);
    step:=0;
    end;
    end;
    Delete(t,1,1);
    end;
    'B':
    begin
    byte_ptr:=0;
    for j:=1 to Length(t) do
    begin
    Inc(byte_ptr);
    case t[j] of
    'A'..'Z': a1[byte_ptr]:=Ord(t[j])-65;
    'a'..'z': a1[byte_ptr]:=Ord(t[j])-71;
    '0'..'9': a1[byte_ptr]:=Ord(t[j])+4;
    '+': a1[byte_ptr]:=62;
    '/': a1[byte_ptr]:=63;
    '=': a1[byte_ptr]:=64;
    end;
    if byte_ptr=4 then
    begin
    byte_ptr:=0;
    real_bytes:=3;
    if a1[1]=64 then real_bytes:=0;
    if a1[3]=64 then
    begin
    a1[3]:=0;
    a1[4]:=0;
    real_bytes:=1;
    end;
    if a1[4]=64 then
    begin
    a1[4]:=0;
    real_bytes:=2;
    end;
    b1[1]:=a1[1]*4+(a1[2] div 16);
    b1[2]:=(a1[2] mod 16)*16+(a1[3]div 4);
    b1[3]:=(a1[3] mod 4)*64 +a1[4];
    if(real_bytes>0)then
    v:= v + chr(b1[1]) ;
    if(real_bytes>1)then
    v:= v + chr(b1[2]) ;
    if(real_bytes>2)then
    v:= v + chr(b1[3]) ;
    end;
    end;
    end;
    end;
    Result:=Copy(s,1,s1-1)+v+Copy(s,s2+2,999);end;