1

'{'#0'S'#0'a'#0'm'#0'p'#0'l'#0'e'#0'-'#0'M'#0'e'#0's'#0's'#0'a'#0'g'#0'e'#0'}'#0デバッガーのように表示される文字列を受け取ります。

デバッグ出力()に出力する必要がありますOutputDebugString

を実行するOutputDebugString(PChar(mymsg))と、受信した文字列の最初の文字のみが表示されます(おそらく文字列の#0終わりマーカーが原因です)。

その文字列を使用できるものに変換するにはどうすればよいOutputDebugStringですか?

アップデート1:コードは次のとおりです。変数の内容を出力したいRxBufStr

procedure ReceivingThread.OnExecute(AContext : TIdContext);
var
  RxBufStr: String;
begin    
  with AContext.Connection.IOHandler do
  begin
    CheckForDataOnSource(10);
    if not InputBufferIsEmpty then
    begin
      RxBufStr := InputBuffer.Extract();
    end;
  end;
end;
4

2 に答える 2

5

質問で示したデータは、UTF-8 ではなく UTF-16 でエンコードされたデータのように見えます。ただし、Unicode 対応の Delphi とstringデータ型を使用しているため、明らかにエンコーディングの不一致があります。私の言いたいことがわかるなら、あなたの文字列変数は二重のUTF-16でエンコードされているようです!

したがってInputBuffer.Extract、データが ANSI または UTF-8 を使用して送信されることを前提としているように見えます。つまり、8 ビットのエンコードです。しかし実際には、データは UTF-16 として送信されます。

この問題を解決するには、バッファの読み取りをバッファの送信に合わせる必要があります。両側が同じエンコーディングを使用していることを確認する必要があります。UTF-8 が適切な選択です。

バッファ内のデータが UTF-16 の場合は、次のコマンドで抽出できます

RxBufStr := InputBuffer.Extract(-1, TIdTextEncoding.Unicode);

UTF-8に切り替える場合は、次のコマンドで抽出します

RxBufStr := InputBuffer.Extract(-1, TIdTextEncoding.UTF8);
于 2012-11-13T11:11:34.607 に答える
0

RxBufStr := InputBuffer.Extract();

コードはターミネータまたはデータサイズを指定していないため、クライアントが送信されたデータの一部のみを受信する場合があります。

指定された(既知の)長さのデータをTIdBytes配列に読み取り、正しいエンコーディングを使用して文字列に変換できます。

それを行う1つの方法は

TEncoding.Unicode.GetString( MyByteArray );

ここにあります

于 2012-11-13T11:46:16.483 に答える