【问题标题】:Delphi XE2: UTF16LE -> UTF8德尔福 XE2:UTF16LE -> UTF8
【发布时间】:2012-05-14 06:30:17
【问题描述】:

网址: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] : 不工作(断线> Shady: ??)

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

UTF8FromUTF16 函数原始VB代码:VB 6.0 -> Delphi XE2 Conversion

帮帮我.. :(

【问题讨论】:

  • 2 不工作?使用 1。或者描述你的期望和你得到了什么。
  • 1. char(0)ansichar(0) 你会想要将 anischar(0) 附加到一个单字节类型 2. write() 真的是 rawbytestring 吗?如果它被声明为字符串,它无论如何都会转换回 UTF16。
  • 是的,“不工作”是毫无希望的。您使用的是哪种写重载?弦一?这将转换回 UTF-16。可能需要直接写字节来保留UTF-8。但我猜是因为我实际上不知道出了什么问题。
  • GolezTrol // 亚洲语言 = 2byte
  • IdTCPClient.IOHandler.Write('#' + '안녕' + Char(0));

标签: delphi unicode utf-8 delphi-xe2 indy


【解决方案1】:

字符串在 XE2 中以 UTF-16 编码。 #2 不起作用,因为您传递的是 UTF8String,而 UnicodeString 是预期的,因此 RTL 将在 Indy 看到数据之前执行 UTF-8 -> UTF-16 转换,然后 Indy 将转换 UTF- 16个数据在传输过程中以自己的默认编码。

如果您想以 UTF-8 格式传输 UnicodeString,您必须通过其 TIdTextEncoding 类告诉 Indy 这样做,例如:

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 数据。

【讨论】:

  • Winsock.SendData('#' + Edit1.Text + Char(0));
  • 您必须使用TIdTextEncoding.GetBytes() 方法将字符串转换为编码的字节数组,然后才能发送字节。
  • 谢谢,但我不明白答案。非常抱歉..你能给一个示例代码吗..?
  • GetBytes() 返回一个TBytes,它是一个动态的字节数组。只需将所需的字符串传递给GetBytes(),然后将字节数组传递给WinSock。这有什么难理解的?
  • var S : 字符串; B:TB;开始 B := TEncoding.UTF8.GetBytes('안녕'); Winsock.SendData('#' + B + #0); ///////// 这对我来说很难........错误:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多