Delphi 德尔福XE2:UTF16LE->;UTF8

Delphi 德尔福XE2:UTF16LE->;UTF8,delphi,unicode,utf-8,delphi-xe2,indy,Delphi,Unicode,Utf 8,Delphi Xe2,Indy,网址: [1]------------------------------------------------------------------- procedure TForm1.FormCreate(Sender: TObject); begin IdTCPClient.Host := '61.97.246.131'; IdTCPClient.Port := 8080; IdTCPClient.Connect; IdTCPClient.IOHandler.Write

网址:

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

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

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;
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] :不工作(字符串断开>阴影:??)

见:

UTF8FromUTF16函数原始VB代码:


帮帮我(

字符串是用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; 
过程TForm1.FormCreate(发送方:TObject);
开始
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)/字符串是UTF-16编码的XE2。#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; 
过程TForm1.FormCreate(发送方:TObject);
开始
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);//2不工作?使用1。或描述您期望的结果和得到的结果。1.char(0)ansichar(0)您希望将anischar(0)附加到一个单字节类型2。write()真的是rawbytestring吗?如果它声明为字符串,它将转换回UTF16。是的,“不工作”非常没有希望。您使用的是哪个写重载?字符串一?它将转换回UTF-16。可能需要直接写入字节以保留UTF-8。但我猜是因为我不知道到底出了什么问题。GolezTrol//Asia language=2byteIdTCPClient.IOHandler.Write('#'+'안녕' + Char(0));<同一个字符串代理2不工作?使用1。或描述您期望的结果和您得到的结果。1.Char(0)ansichar(0)您希望将anischar(0)附加到一个单字节类型2.write()真的是rawbytestring吗?如果声明为字符串,它将转换回UTF16。是的,“不工作”非常没有希望。您使用的是哪个写重载?字符串一?它将转换回UTF-16。可能需要直接写入字节以保留UTF-8。但我猜是因为我不知道到底出了什么问题。GolezTrol//Asia language=2byteIdTCPClient.IOHandler.Write('#'+'안녕' + Char(0));TIdTextEncoding.GetBytes()
方法将字符串转换为编码的字节数组,然后您可以发送字节。谢谢,但我不理解答案。非常抱歉..您能给出一个示例代码吗?
GetBytes()
返回一个
TBytes
,这是一个字节的动态数组。只需将所需字符串传递给
GetBytes())
,然后将字节数组传递给WinSock。这有什么难理解的?var S:String;B:TBytes;begin B:=TEncoding.UTF8.GetBytes('안녕'); Winsock.SendData('#'+B+#0);//对我来说很难……。错误:(Winsock.SendData('#'+Edit1.Text+Char(0));TIdTextEncoding.GetBytes()
方法将字符串转换为编码的字节数组,然后您可以发送字节。谢谢,但我不理解答案。非常抱歉..您能给出一个示例代码吗?
GetBytes()
返回一个
TBytes
,这是一个字节的动态数组。只需将所需字符串传递给
GetBytes())
,然后将字节数组传递给WinSock。这有什么难理解的?var S:String;B:TBytes;begin B:=TEncoding.UTF8.GetBytes('안녕'); Winsock.SendData(“#”+B+#0);//这对我来说很难……。错误:(