procedure send();
var temp:widestring;
   begin
      temp:='.....' //.....为一个unicode字符串
      ServerSocket1.Socket.Connections[0].Sendtext(trim(temp));
    end;客户端是用的
str1:widestring;
str1:=socket.ReceiveText;
接收的。我但是客户端显示出来是乱码。我想应该是sendtext的问题,因为sendtext里面的默认参数类型是string,在发送是可能已经将widestring转化为string了,造成了字符丢失。我又尝试了用sendbuf来发送:
procedure strtostream();
var temp:widestring;
    a:tmemorystream;
    buffer:PChar;
   begin
      temp:='.....'        //.....为一个unicode字符串
      GetMem(Buffer,length(temp));
                         //TntEdit2.Text := temp;
      Tntmemo1.GetTextBuf(Buffer,length(temp))
      a:=tmemorystream.create;
      a.write(Buffer^,length(temp));
      ServerSocket1.Socket.Connections[0].SendBuf(Buffer^,length(temp));
      a.free;
    end;
结果客户端收到的还是乱码,分析了一下觉得可能是GetTextBuf方法的问题,GetTextBuf返回的也是一个string类型而不是widestring。不知道问题出在哪了?
希望高手们指点一下,另外我不知道是否可以用sendstream来发送,如果可以的话怎样把Unicode字符串存在一个stream里面在发送,也请指教。谢谢!

解决方案 »

  1.   

    procedure send();
    var temp:widestring;
        iSended:integer;
       begin
          temp:='.....' //.....为一个unicode字符串
          iSended:=ServerSocket1.Socket.Connections[0].SendBuf(Pwidechar(temp)^,length(temp)*2);
    .....
        end;
      

  2.   

    Re: halfdream(哈欠)
    你的代码我测试过了,但是发送后,客户端只能接受到字符串的第一个字符。
    比如我的字符串widesring:='first place';
    收到的只有f一个字符。
    我又加了一行代码做测试TntEdit1.text:=Pwidechar(temp)^
    TntEdit中能够完全显示'first place'。
    不知何解。是因为我的客户端是str:=socket.ReceiveText;
    的原因还是length(temp)的原因啊?
      

  3.   

    是接受端的问题,接收端RECEIVETEXT,不能要直接输出显示,
    因为它是当成单字节字符处理,在显示上会遇#0字符截断。接收的时候,可以这样处理:
    var
      str:string;
      wstr:widestring;
      n:Integer; str:=socket.ReceiveText;
     n:=length(str);
     setlength(wstr,n div 2);
     move(pchar(str)^,pwidechar(wstr)^,n);大致这样。。没有调试。