0

URL : http://www.gagalive.kr/livechat1.swf?chatroom=~~~BBQ

[1] ---------------------------------------------------- --------------------

procedure TForm1.FormCreate(Sender: TObject);

begin

 IdTCPClient.Host := '61.97.246.131';

  IdTCPClient.Port := 8080;

  IdTCPClient.Connect;

  IdTCPClient.IOHandler.Write('Ag8m' + Char(0));

  IdTCPClient.IOHandler.Write('LShady|###BBQ' + Char(0));

  IdTCPClient.IOHandler.Write('#' + 'Some Text'  + Char(0));

  IdTCPClient.Disconnect;

end;

[2]-------------------------------------------------------------- --------------------

function UTF8FromUTF16_2(sUTF16: UnicodeString): UTF8String; 

begin   

  Result := sUTF16; 

end; 

procedure TForm1.FormCreate(Sender: TObject);

begin

 IdTCPClient.Host := '61.97.246.131';

  IdTCPClient.Port := 8080;

  IdTCPClient.Connect;

  IdTCPClient.IOHandler.Write('Ag8m' + Char(0));

  IdTCPClient.IOHandler.Write('LShady|###BBQ' + Char(0));

  IdTCPClient.IOHandler.Write(UTF8FromUTF16_2('#' + '안녕'  + Char(0)));

  IdTCPClient.Disconnect;

end;

[1] : 稼働中

[2] : 動作していません (文字列が壊れています > 怪しい: ??)

参照:http ://www.gagalive.kr/livechat1.swf?chatroom=~~~BBQ

UTF8FromUTF16 関数 元の VB コード : VB 6.0 -> Delphi XE2 変換

助けて.. :(

4

1 に答える 1

3

文字列は、XE2 でエンコードされた UTF-16 です。UTF8String#2は、aが期待される場所にaを渡しているため機能しませんUnicodeString。したがって、RTLは、Indyがデータを見る前にUTF-8 -> UTF-16変換を実行し、次にIndyはUTF-16データを独自のデフォルトに変換します送信中のエンコード。

a を UTF-8 として送信したい場合はUnicodeString、Indy にそのTIdTextEncodingクラスを介してそれを行うように指示する必要があります。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  IdTCPClient.Host := '61.97.246.131'; 
  IdTCPClient.Port := 8080; 
  IdTCPClient.Connect; 
  IdTCPClient.IOHandler.Write('Ag8m'#0); 
  IdTCPClient.IOHandler.Write('LShady|###BBQ'#0); 
  IdTCPClient.IOHandler.Write('#안녕'#0, TIdTextEncoding.UTF8); // <-- here
  IdTCPClient.Disconnect; 
end; 

または:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
  IdTCPClient.Host := '61.97.246.131'; 
  IdTCPClient.Port := 8080; 
  IdTCPClient.Connect; 
  IdTCPClient.IOHandler.DefStringEncoding := TIdTextEncoding.UTF8; // <-- here
  IdTCPClient.IOHandler.Write('Ag8m'#0); 
  IdTCPClient.IOHandler.Write('LShady|###BBQ'#0); 
  IdTCPClient.IOHandler.Write('#안녕'#0);
  IdTCPClient.Disconnect; 
end; 

Indy に使用するエンコーディングを指定しないと、デフォルトで ASCII になり、Unicode データが壊れたり失われたりします。

于 2012-05-15T00:02:51.437 に答える