6

我有一个使用 TTCPServer 组件用 Delphi 编写的简单服务器应用程序,它有一个非常基本的 OnAccept 事件过程,如下所示......

“127.0.0.1 上的侦听器通过端口:10000”

procedure TMainWindow.TcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  S: String;
begin
  S := ClientSocket.Receiveln();
  ShowMessage(S);
  ShowMessage(IntToStr(Length(S)));

  Memo1.Lines.Add(S);
end;

还有一个像这样的简单的php页面......

<?php
$address = '127.0.0.1';
$port = 10000;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($sock, $address, $port);

socket_set_option($sock, SOL_SOCKET, SO_KEEPALIVE, 1);
$msg = 'Hello...!';
echo socket_write($sock, $msg, strlen($msg));

socket_close($sock);
?> 

现在的问题是,当我尝试使用 php 页面写入连接的套接字时,没有发生错误,但是 Delphi 应用程序(侦听器)中接收到的文本向我显示了错误的结果,例如“效汬⹯⸮!”

我应该怎么办 ???

4

2 回答 2

6

此功能应该满足您的需求(我希望)

function UTF8ToUTF16(AUTF8String: RawByteString): String;
begin
  SetCodePage(AUTF8String, 0, False);
  Result := AUTF8String;
end;

现在你应该能够做到这一点:

procedure TMainWindow.TcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  S: String;
begin
  S := UTF8ToUTF16(ClientSocket.Receiveln());
  ShowMessage(S);
  ShowMessage(IntToStr(Length(S)));

  Memo1.Lines.Add(S);
end;
于 2012-04-30T07:48:36.777 回答
1

正如“Remy Lebeau”所说,Delphi 2009+ 默认情况下以 Unicode 形式读取和写入字符串,但 PHP 十年关于根据字符串变量上下文进行编码。为了解决这个问题,我们需要在 Delphi 监听器应用程序中使用类似“Unicode2Ascii”的函数......

于 2012-05-02T04:25:59.220 回答