【问题标题】:Delphi XE - SendText through ServerSocket returns Chinese or vietnamese characters on the other endDelphi XE - 通过ServerSocket的SendText在另一端返回中文或越南字符
【发布时间】: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:请显示接收文件名的客户端代码。请注意,TClientSocketTServerSocket 不会正确实现对 UnicodeString 的支持,因此最好将字符串数据编码为 UTF-8,然后改用 SendBuf()ReceiveBuf()
  • @digitalanalog: SendText()ReceiveText()AnsiString 上运行,而不是在 UnicodeString 甚至 RawByteString 上运行。 AnsiString 在 D2009+ 中可识别代码页,这意味着在调用 SendText()ReceiveText() 时将发生隐式数据转换,可能会返回错误的 AnsiString,其数据与其代码页不匹配。

标签: string delphi tcp client-server delphi-xe


【解决方案1】:

嗯,您的问题来自您将数据作为 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; 

【讨论】:

  • @Ken 这正是我的错误。
【解决方案2】:

TClientSocket 自 Delphi 6 起已弃用(请参阅 Is Delphi TClientSocket (still) deprecated?) 所以我预计 Unicode 数据和其他领域会出现问题。正如其中一个答案所写,TClientSocket 和 TServerSocket 也使用了基于 Windows 消息的无效设计。所以我会尝试使用 Indy 或 Synapse。这也可以使它为跨平台使用做好准备(Windows 消息在 OSX 上不可用)。

【讨论】:

  • @mjn 有趣。我将不得不在下一次修订中实施您的建议。谢谢。
【解决方案3】:

我解决了我的问题。我不确定为什么它可以在 Windows XP 上完美运行。

无论如何,我发送和接收文本如下。我最初是通过 ReceiveBuf 方法将文本读入字符数组。

Socket.SendText('File.log');

theStr:String;
theStr := Socket.ReceiveText;

感谢您帮助我解决自己的编程问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多