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应用程序(监听器)中收到的文本向我显示了一些错误的结果,例如"效汬⸮!"
我该怎么办 ???
这个功能应该满足你的需求(我希望)
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)
正如“Remy Lebeau”所说,Delphi 2009+ 默认情况下以 Unicode 形式读取和写入字符串,但 PHP 十年则根据字符串变量上下文进行编码。为了解决这个问题,我们需要在 Delphi 监听器应用程序中使用类似“Unicode2Ascii”函数的东西......