啥版本Delphi为何不用TEncoding来做字符串和Byte数组的转换呢

解决方案 »

  1.   

    你自已用了 AnsiToUtf8(Edit2.Text);  转出来不乱码才叫怪
      

  2.   


    xe5的,因为上家要求,必须转成byte数组发到服务器上验证
      

  3.   

    转回来的也是Utf8String啊你是怎么理解utf8的呢
    s 转到b  再转d   你认为s=d  你是表达这个意思吧。  ord  char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s  把s写成byte不就行了吗
     for i := 1 to len do
     begin
       b[i-1] := ord(s[i]);
     end;  你这个就已经错了
      

  4.   

    var
      s: UTF8String;
      b: array [0..1024] of byte;
    begin
      s := 'abcd汉字';
      move(s[1], b, length(s));
    end;
      

  5.   


    array of byte转成string呢?现在主要是转出来会乱码
      

  6.   


    array of byte转成string呢?现在主要是转出来会乱码
      

  7.   

    转回来的也是Utf8String啊你是怎么理解utf8的呢
    s 转到b  再转d   你认为s=d  你是表达这个意思吧。  ord  char这只是对 ansic码适用,你这样会丢字节你要做的不是很简单 你已经得到了uft8的 s  把s写成byte不就行了吗
     for i := 1 to len do
     begin
       b[i-1] := ord(s[i]);
     end;  你这个就已经错了

    其实d是服务器发过来的数据,里边包括中文
      

  8.   

    首先你要知道你转换它干什么?如果只是要复制走,那可以用move,如果只是以另一种方式访问,既没必要转换,也没必要复制,Delphi有一个非常NB的特性,可以给一个变量声明其他类型的别名:
    var
      s: string;
      p: PByte absolute s;
      i: integer;
    //...
      s := Edit2.Text;
      for i := 0 to Length(s) * SizeOf(char) - 1 do
    // p[i] 现在表示s的一个字节
      

  9.   


    d:array of byte
    d是从服务器里发过来的,是utf8串转成的数组,我收到后要将期还原成string串,里边会包含中文,现在的问题是,还原过来后,中文部分全变成乱码了
    还有,这个程序是跑在android下的, p: PByte absolute s;这东西能在android下用吗?
      

  10.   

    如果你确保接收的d缓冲区数据和长度都没问题的话,那是很简单的:var
      c: array of AnsiChar absolute d;  // alias for d
      s: UTF8String;
    // ...
      s := PAnsiChar(c);  // convert input data to UTF8 string
      

  11.   


    XE5下,你确定这个能用?
    DelphiGuy的应该没有问题吧,不过这样写要注意末尾需要有#0
      

  12.   

    没问题,不需要0终止也可以的,比如:var
      d: array of byte;
      c: array of AnsiChar absolute d;  // alias for d
      s: UTF8String;
    // ...
      SetLength(d, 6);
      d[0] := $e4;
      d[1] := $b8;
      d[2] := $ba;
      d[3] := $e4;
      d[4] := $b8;
      d[5] := $bb; // d中是“为主”二字的UTF8编码
      s := PAnsiChar(c);
      ShowMessage(s);
      

  13.   

    你这个恰好后面是#0
    PAnsiChar会一直读直到遇到#0,不想加#0的话可以直接Move
      

  14.   

    你也可以试验其他数据:
      d[0] := $41;
      d[1] := $42;
      d[2] := $43;
      d[3] := $44;
      d[4] := $45;
      d[5] := $46; 
    这个没有0了吧,一样可以的。另外,我发现,实际上可以直接:s := PAnsiChar(d);也没有问题的。
    可能出现问题的是这种情况:
     SetLength(d, 6);
    ...
     SetLength(d, 4);
    ...
     s := PAnsiChar(d);
    此时转换后仍然得当了长度为6的串,前4个字符是正确的,后面两个是之前遗留的。
      

  15.   

    我知道你的意思是认为动态数组之后的0起了终止的作用,如果这样的话, s := PAnsiChar(d);得到的应该是随机长度的串,但是事实并非如此。
    唯一可能出现问题的情况就是我前面说的,把动态数组改小(改大没有问题),而且大小和之前的差不多,此时转换出来的串是上一次的长度。
      

  16.   

    这样就彻底安全了:
    SetLength(s, Length(d));
    StrLCopy(PAnsiChar(s), PAnsiChar(d), Length(b));