String Delphi XE-SendText通过ServerSocket在另一端返回中文或越南语字符

String Delphi XE-SendText通过ServerSocket在另一端返回中文或越南语字符,string,delphi,tcp,client-server,delphi-xe,String,Delphi,Tcp,Client Server,Delphi Xe,我编写了一个在Windows7上运行的简单文件传输程序。我在一台计算机上作为服务器运行这个程序,在另一台计算机上作为客户端运行。客户端发送文件传输请求,然后服务器首先发送文件名。然后,客户端确认它获得了文件名并发送了文件内容 这个程序在XP上运行得非常完美。现在我们尝试在Windows7计算机上运行它,但它有问题。问题是,每当服务器向客户端回复文件名时 服务器通过调用ServerSocket1.SendText('File1.dat')发送文本 客户端获得的内容看起来像中文或越南语字符。所以,我

我编写了一个在Windows7上运行的简单文件传输程序。我在一台计算机上作为服务器运行这个程序,在另一台计算机上作为客户端运行。客户端发送文件传输请求,然后服务器首先发送文件名。然后,客户端确认它获得了文件名并发送了文件内容

这个程序在XP上运行得非常完美。现在我们尝试在Windows7计算机上运行它,但它有问题。问题是,每当服务器向客户端回复文件名时

服务器通过调用ServerSocket1.SendText('File1.dat')发送文本

客户端获得的内容看起来像中文或越南语字符。所以,我的程序失败了。我的客户端程序必须知道文件名。因此,它知道在hardrive的特定位置保存它的位置

我想,SendText函数接受AnsiString,我发送的是字符串数据。你认为这就是原因吗

更新

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   Socket.SendText(AnsiString('calibrate.log'));
end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
   Buffer:array[0..999] of char;
begin
   Socket.ReceiveBuf(Buffer,Socket.ReceiveLength);
end;

我解决了我的问题。我不知道为什么它能在WindowsXP上完美地工作

不管怎样,我发送和接收的短信如下。我最初是通过ReceiveBuf方法将文本读入字符数组

Socket.SendText('File.log');

theStr:String;
theStr := Socket.ReceiveText;

感谢您帮助我认识到我自己的编程问题。

TClientSocket自Delphi6以来就被弃用了(请参阅
)因此,我预计Unicode数据和其他领域会出现问题。正如其中一个答案中所述,TClientSocket和TServerSocket也使用了基于Windows消息的无效设计。所以我会尝试用印地或突触来代替。这也将为跨平台使用做好准备(Windows消息在OSX上不可用)。

好吧,您的问题来自这样一个事实,即您将数据发送为AnsiString,并使用WideChars读取数据(Char是Delphi XE中WideChar的别名)

为此更改代码很可能会解决您的问题

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var    
  Buffer:array[0..999] of Ansichar; 
begin    
  Socket.ReceiveBuf(Buffer,Socket.ReceiveLength); 
end; 

给我们看看代码。您是否在XP和Win7上运行相同的exe?是的,将ANSI编码的文本发送到期望UTF-16编码文本的管道会导致接收到中文文本!@大卫,是的,我只在Windows7系统上运行相同的exe。@DavidHeffernan,我明白了。编译时,它会对sendtext方法发出警告,指出它需要解析,并且通过隐式转换可能会丢失数据。因此,我将其显式地键入AnsiString,如上所示。@digitalanalog:请显示接收文件名的客户端代码。请注意,
TClientSocket
TServerSocket
没有正确实现对
UnicodeString
的支持,因此最好对字符串数据进行编码,比如UTF-8,然后使用
SendBuf()
ReceiveBuf()
。@digitalanalog:
SendText()
ReceiveText())
AnsiString
上操作,而不是在
UnicodeString
上操作,甚至不在
RawByteString
上操作<在D2009+中,code>AnsiString是代码页感知的,这意味着调用
SendText()
时将发生隐式数据转换,
ReceiveText()
可能返回一个错误的
AnsiString
,其数据与其代码页不正确匹配。@mjn有趣。我将不得不在下一次修订中实施你的建议。谢谢你。@Ken,那正是我的错误。