用php和delphi简单套接字?

M.J*_*adi 6 php sockets delphi

我有一个简单的服务器应用程序使用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;
Run Code Online (Sandbox Code Playgroud)

这样一个简单的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);
?> 
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办 ???

LaK*_*ven 6

这个功能应该满足你的需求(我希望)

function UTF8ToUTF16(AUTF8String: RawByteString): String;
begin
  SetCodePage(AUTF8String, 0, False);
  Result := AUTF8String;
end;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)


M.J*_*adi 1

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