простой сокет с 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...