2012-04-30 35 views
6

Tôi có một ứng dụng máy chủ đơn giản viết bằng Delphi sử dụng thành phần TTCPServer nó có một thủ tục sự kiện OnAccept thực sự cơ bản như dưới đây ...socket đơn giản với php và delphi?

"Listener vào 127.0.0.1 trên cổng: 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; 

Và một trang php đơn giản như thế này ...

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

Bây giờ vấn đề là khi tôi đang cố gắng viết vào ổ cắm kết nối với trang php không xảy ra lỗi nhưng văn bản nhận được trong ứng dụng Delphi (người nghe) chỉ cho tôi kết quả sai một số thứ như thế này "效 汬 ⹯⸮!"

tôi nên làm gì ???

+0

Bạn đang sử dụng phiên bản Delphi nào? 'Receiveln()' trả về một 'Chuỗi', là một' UnicodeString' trong D2009 +, nhưng 'TTCPServer' không hỗ trợ Unicode! Bạn thực sự không nên sử dụng 'TTCPServer' anyway, nó là một thành phần CLX lỗi thời và không được chấp nhận. Sử dụng một cái gì đó hiện đại hơn, chẳng hạn như từ Indy, ICS hoặc Synapse. –

Trả lời

1

Như "Remy Lebeau" nói Delphi 2009+ đọc và viết chuỗi theo dạng Unicode theo mặc định nhưng thập kỷ PHP về mã hóa theo ngữ cảnh biến chuỗi. Để giải quyết vấn đề, chúng tôi cần sử dụng chức năng "Unicode2Ascii" trong ứng dụng nghe Delphi ...

6

Chức năng này sẽ phục vụ nhu cầu của bạn (Tôi hy vọng)

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

Bây giờ bạn sẽ có thể làm điều này:

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

Mã chính xác để sử dụng cho UTF-8 là 65001, không phải 0. –

+0

Chúng tôi muốn UTF-16 không phải là UTF-8! – LaKraven

+0

Không ... Vẫn không hoạt động :( –

Các vấn đề liên quan