простой сокет с php и delphi?

у меня есть простое серверное приложение, написанное на Delphi с использованием компонента TTCPServer, у него есть действительно базовая процедура события 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 (слушатель) показывает мне неправильный результат, например это " 效汬!"

что делать ???

2 ответов


эта функция должна служить вашим потребностям (я надеюсь)

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;

As "Реми Лебо" говорит Delphi 2009 + читает и пишет строку в форме Unicode по умолчанию, но декада PHP о кодировании в соответствии с контекстом строковой переменной. Чтобы решить проблему, нам нужно использовать что-то вроде функции "Unicode2Ascii" в приложении Delphi listener...