6

TTCPServerコンポーネントを使用してDelphiで記述された単純なサーバーアプリがあります。これには、以下のような非常に基本的な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アプリケーション(リスナー)で受信したテキストに、この「有効汬⹯⸮!」のような間違った結果が表示されることです。

私は何をすべきか ???

4

2 に答える 2

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;
于 2012-04-30T07:48:36.777 に答える
1

「RemyLebeau」が言うように、Delphi 2009+はデフォルトでUnicode形式で文字列を読み書きしますが、PHPは文字列変数のコンテキストに従ったエンコーディングについて10年です。この問題を解決するには、Delphiリスナーアプリケーションで「Unicode2Ascii」関数のようなものを使用する必要があります...

于 2012-05-02T04:25:59.220 に答える