2012-05-14 27 views
0

URL:http://www.gagalive.kr/livechat1.swf?chatroom=~~~BBQデルファイXE2:UTF16LE - > UTF8

[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 Conversion

私を助けて.. :(

+4

2動作していませんか? 1.あなたが何を期待し、何を得たかを記述します。 – GolezTrol

+0

1. char(0)<> ansichar(0)あなたはonecharte型にanischar(0)を添付したいでしょうか?2. write()は本当にrawbytestringですか?それがstringとして宣言されていれば、とにかくUTF16に変換されます。 –

+0

ええ、「うまくいきません」とはかなり希望がありません。どの書き込みオーバーロードを使用していますか?文字列1?それはUTF-16に変換されます。おそらく、UTF-8を保持するために直接バイトを書く必要があります。しかし、私は実際に何が間違っているのか分からないので、私は推測しています。 –

答えて

3

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

あなたはUTF-8としてUnicodeStringを送信したい場合、あなたは、その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に伝えないでください。Unicodeデータが壊れたり失われたりするASCIIにデフォルト設定されます。

+0

Winsock.SendData( '#' + Edit1.Text + Char(0)); user1390537

+0

文字列をエンコードされたバイト配列に変換するには、 'TIdTextEncoding.GetBytes()'メソッドを使用しなければなりません。バイトを送ることができます。 –

+0

ありがとうございますが、私は答えを理解していません。 私は非常にごめんなさい..サンプルコードを与えることができます..? – user1390537

関連する問題