2012-05-14 90 views
0

URL:http://www.gagalive.kr/livechat1.swf?chatroom=~~~BBQDelphi 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)你会想把anischar(0)附加到一个字节类型2.是write()真的是rawbytestring吗?如果它被声明为字符串,它将无论如何转换回UTF16。 –

+0

是的,“不工作”是相当无望的。您使用哪种写入超载?字符串一个?这将转换回UTF-16。可能需要直接写入字节来保留UTF-8。但我猜,因为我实际上并不知道什么是错的。 –

回答

3

字符串在XE2中编码为UTF-16。 #2不起作用,因为您传递UTF8String(其中UnicodeString是预期的),所以RTL将在Indy看到数据之前执行UTF-8→UTF-16转换,然后Indy会将UTF-16数据转换为其数据在传输过程中拥有默认编码。

如果你想传递一个UnicodeString为UTF-8,你必须告诉印地做到这一点,通过其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数据。

+0

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

+0

您必须使用'TIdTextEncoding.GetBytes()'方法将字符串转换为编码字节数组,然后才能发送字节。 –

+0

谢谢,但我不明白答案。 我很抱歉..你能给一个例子代码..? – user1390537