var
  b,b1:TBytes;
  s:RawByteString;
begin
  SetLength(b,24);
  b[0]:=60;
  b[1]:=98;
  b[2]:=114;
  b[3]:=62;
  b[4]:=229;
  b[5]:=176;
  b[6]:=138;
  b[7]:=230;
  b[8]:=149;
  b[9]:=172;
  b[10]:=231;
  b[11]:=154;
  b[12]:=132;
  b[13]:=81;
  b[14]:=81;
  b[15]:=231;
  b[16]:=148;
  b[17]:=168;
  b[18]:=230;
  b[19]:=136;
  b[20]:=183;
  b[21]:=239;
  b[22]:=188;
  b[23]:=154;
  s:=StringOf(b);
  Edit2.Text:=UTF8Decode( s);
  b1:=BytesOf(s);
end;
我收取邮件是收到的一段UTF8编码的数据,发现解码后是乱码,最后调试后发现UTF8解码不完全,后来发现竟然转回去还会丢数据。这个邮件在163下收取是不会乱码的。
这一小段的数据原始的样子是这样的,(9, 9, 60, 98, 114, 62, 229, 176, 138, 230, 149, 172, 231, 154, 132, 81, 81, 231, 148, 168, 230, 136, 183, 239, 188, 154, 13, 10)

解决方案 »

  1.   

    我只能说string类型虽然也是个数组,但是下标是从一开始的,s[0]是用来存放字符串长度的
      

  2.   

    b这个是一个字节数组,不是string类型吧?
      

  3.   

    确实改用move就没丢失数据了,乱码也解决了。难道这是VCL库的一个bug?stringof是D2009之后新增的一个函数,竟然会丢数据,狂汗!
      

  4.   

    D2009里的string应该已经是unicode类型了吧,和D7中的不一样了