2012-04-30 16 views
6

我一直在使用它象下面這樣很基本的OnAccept事件過程TTCPServer組件在Delphi編寫一個簡單的服務器應用程序...使用php和delphi的簡單套接字?

「監聽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應用程序接收到的文本(聽衆)告訴我錯誤的結果有些事情是這樣的「效汬⹯⸮!」

我該怎麼辦?

+0

您使用的是什麼版本的Delphi? 'Receiveln()'返回'String',它是D2009 +中的'UnicodeString',但'TTCPServer'不支持Unicode!無論如何,你真的不應該使用'TTCPServer',它是一個過時的和不推薦使用的CLX組件。使用更現代的東西,如Indy,ICS或Synapse。 –

回答

1

由於「雷米勒博」說德爾福2009+讀取和默認情況下以Unicode形式寫入字符串,但根據字符串變量上下文編碼PHP十年編碼。爲了解決這個問題,我們需要在Delphi監聽器應用程序中使用諸如「Unicode2Ascii」函數......

6

這個功能應該滿足您的需求(希望)

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

用於UTF-8的正確代碼頁是65001,而不是0. –

+0

我們希望UTF-16不是UTF-8! – LaKraven

+0

否...仍然不工作:( –