【发布时间】:2011-09-28 15:39:46
【问题描述】:
我编写了一个在 Windows 7 上运行的简单文件传输程序。我将该程序作为一台计算机上的服务器和另一台计算机上的客户端运行。客户端发出文件传输请求,然后服务器首先发出文件名。然后,客户端确认它获得了文件名并发送文件的内容。
这个程序在 XP 上运行完美。现在我们正在尝试在 Windows 7 计算机上运行它,但它有问题。问题是每当服务器用文件名回复客户端时。
服务器通过调用 ServerSocket1.SendText('File1.dat') 发送文本。
客户得到的看起来像是中文或越南语字符。所以,我的程序失败了。我的客户端程序必须知道文件的名称。因此,它知道将其保存在硬盘的特定位置。
我认为,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;
【问题讨论】:
-
向我们展示代码。你在XP和Win7上运行相同的exe吗?是的,将 ANSI 编码文本发送到需要 UTF-16 编码文本的管道会导致接收到中文文本!
-
@David,是的,我只在 Windows 7 系统上运行相同的 exe。
-
@DavidHeffernan,我明白了。编译时,它会警告我 sendtext 方法它需要 AnsiString 并且通过隐式转换我可能会丢失数据。因此,我将其显式转换为 AnsiString,如上所示。
-
@digitalanalog:请显示接收文件名的客户端代码。请注意,
TClientSocket和TServerSocket不会正确实现对UnicodeString的支持,因此最好将字符串数据编码为 UTF-8,然后改用SendBuf()和ReceiveBuf()。 -
@digitalanalog:
SendText()和ReceiveText()在AnsiString上运行,而不是在UnicodeString甚至RawByteString上运行。AnsiString在 D2009+ 中可识别代码页,这意味着在调用SendText()和ReceiveText()时将发生隐式数据转换,可能会返回错误的AnsiString,其数据与其代码页不匹配。
标签: string delphi tcp client-server delphi-xe