2012-05-14 3 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; 

,536,913,632 10

[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) 1 바이트 유형에 anischar (0)을 첨부하려고합니다. 2. write()는 rawbytestring입니까? 문자열로 선언되면 어쨌든 UTF16으로 다시 변환됩니다. –

+0

그래, "일하지 않는다"는 절망적이다. 어떤 쓰기 오버로드를 사용하고 있습니까? 문자열 하나? 그러면 UTF-16으로 다시 변환됩니다. UTF-8을 유지하기 위해 바이트를 직접 작성해야합니다. 그러나 실제로 무엇이 잘못되었는지를 모르기 때문에 나는 추측하고 있습니다. –

답변

3

문자열은 XE2에서 UTF-16으로 인코딩됩니다. # 2는 UnicodeString이 예상되는 곳에 UTF8String을 전달하므로 인디가 데이터를보기 전에 RTL이 UTF-8 -> UTF-16 변환을 수행 한 다음 인디가 UTF-16 데이터를 해당 UTF-16 데이터로 변환합니다. 전송 중 자신의 기본 인코딩

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; 

당신이 만약 당신이 UnicodeString UTF-8로 전송하려면

, 당신은 예를 들어, 그 TIdTextEncoding 클래스를 통해, 그렇게 인디 말할 필요 인디에게 어떤 인코딩을 사용할지 말하지 마라. 유니 코드 데이터를 망가 뜨리거나 잃어 버리는 아스키가 기본값이 될 것이다.

+0

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

+0

문자열을 인코딩 된 바이트 배열로 변환하려면'TIdTextEncoding.GetBytes()'메서드를 사용해야하고 바이트를 보낼 수 있습니다. –

+0

감사합니다.하지만 대답을 이해하지 못합니다. 죄송합니다 .. 예제 코드를 제공해 주시겠습니까 ..? – user1390537

관련 문제