2012-04-30 11 views
6

mam prostą aplikację serwera napisany w Delphi za pomocą komponentu TTCPServer to ma naprawdę podstawowe procedury zdarzenia OnAccept jak poniżej ...proste gniazdo z php i delphi?

„Listener na 127.0.0.1 na porcie: 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; 

I prosta strona php tak ...

<?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); 
?> 

teraz problem jest gdy próbuję napisać w gniazdu ze strony php wystąpił żaden błąd, ale otrzymał tekst w aplikacji Delphi (słuchacz) pokazują mnie zły wynik coś takiego jak "效 汬 ⹯⸮!"

co mam zrobić?

+0

Jakiej wersji Delphi używasz? 'Receiveln()' zwraca 'String', który jest' UnicodeString' w D2009 +, ale 'TTCPServer' nie obsługuje Unicode! Naprawdę nie powinno się używać 'TTCPServer' tak czy inaczej, jest to przestarzały i przestarzały komponent CLX. Użyj czegoś bardziej nowoczesnego, np. Z Indy, ICS lub Synapse. –

Odpowiedz

1

Jak "Remy Lebeau" mówi Delphi 2009+ i czyta zapisuje ciąg znaków w postaci Unicode domyślnie, ale dekadę PHP o kodowaniu zgodnie z kontekstem zmiennej łańcuchowej. Aby rozwiązać ten problem, musimy użyć funkcji "Unicode2Ascii" w aplikacji nasłuchującej Delphi ...

6

Funkcja ta powinna służyć potrzebom (mam nadzieję)

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

Teraz powinieneś być w stanie to zrobić:

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; 
+1

Poprawna strona kodowa do użycia w UTF-8 to 65001, a nie –

+0

Chcemy, aby UTF-16 nie był UTF-8! – LaKraven

+0

Nie ... Nadal nie działa :( –