String Delphi XE-SendText通过ServerSocket在另一端返回中文或越南语字符
我编写了一个在Windows7上运行的简单文件传输程序。我在一台计算机上作为服务器运行这个程序,在另一台计算机上作为客户端运行。客户端发送文件传输请求,然后服务器首先发送文件名。然后,客户端确认它获得了文件名并发送了文件内容 这个程序在XP上运行得非常完美。现在我们尝试在Windows7计算机上运行它,但它有问题。问题是,每当服务器向客户端回复文件名时 服务器通过调用ServerSocket1.SendText('File1.dat')发送文本 客户端获得的内容看起来像中文或越南语字符。所以,我的程序失败了。我的客户端程序必须知道文件名。因此,它知道在hardrive的特定位置保存它的位置 我想,SendText函数接受AnsiString,我发送的是字符串数据。你认为这就是原因吗 更新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')发送文本 客户端获得的内容看起来像中文或越南语字符。所以,我
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,那正是我的错误。