2012-04-30 24 views
6

Ho una semplice applicazione di server scritto in Delphi usando componente TTCPServer ha una routine evento OnAccept veramente di base come qui di seguito ...socket semplice con php e delphi?

"Listener su 127.0.0.1 sulla porta: 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; 

E una semplice pagina PHP come questo ...

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

Ora il problema è quando sto cercando di scrivere nella presa collegata con la pagina php si è verificato alcun errore, ma il testo ricevuto nell'applicazione Delphi (ascoltatore) mi mostra il risultato sbagliato qualche cosa come questa "效 汬 ⹯⸮!"

cosa devo fare ???

+0

Quale versione di Delphi stai usando? 'Receiveln()' restituisce un 'String', che è un' UnicodeString' in D2009 +, ma 'TTCPServer' non supporta Unicode! In realtà non dovresti usare 'TTCPServer', è un componente CLX obsoleto e obsoleto. Usa qualcosa di più moderno, ad esempio da Indy, ICS o Synapse. –

risposta

1

Come "Remy Lebeau" dice Delphi 2009+ legge e scrive la stringa in formato Unicode per impostazione predefinita, ma il decennio di PHP sulla codifica in base al contesto variabile della stringa. Per risolvere il problema dobbiamo usare qualcosa come la funzione "Unicode2Ascii" nell'applicazione listener Delphi ...

6

Questa funzione dovrebbe servire le vostre esigenze (spero)

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

Ora si dovrebbe essere in grado di fare questo:

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

La codepage corretta da utilizzare per UTF-8 è 65001, non 0. –

+0

Vogliamo UTF-16 non UTF-8! – LaKraven

+0

No ... Ancora non funziona :( –