2016-07-26 3 views
2

는 좀 없음 라틴어의 charcter를 삽입 한 다음 idTcpclientiDTCPServer에서 보낸 메모리 스트림 안의 비 (非) 라틴 문자를 읽는 방법?

LVU := TStringList.Create; 
LVU.Add('مرحبا'); 
try 

    if (LVU.Count > 0) then 
    begin 
    memorylist := TMemoryStream.Create; 
    try 
     LVU.SaveToStream(memorylist); 
     memorylist.Position := 0; 
     AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8; 
     AContext.Connection.IOHandler.LargeStream := true; 
     AContext.Connection.IOHandler.Write(memorylist, 0, true); 
    finally 
     memorylist.Free; 
    end; 
    end; 
finally 
    LVU.Free; 
end; 

하지만 클라이언트가 그것을받을 때, 그것뿐만 MS 내부의 텍스트 받아 봐에 IDTCPserver에서 보내이 코드가 '를 ???????' 무슨 문제가 될 수 있니? utf8에 이미 연결 인코딩을 설정했습니다.

이 서버를 우분투에서 실행합니다. Windows에서 서버를 사용하려고하면 정상적으로 텍스트가 나타납니다.

는 그리고 이것은 내가

FMSFROMCALL := TMemoryStream.Create; 
FTCP.Socket.LargeStream := True; 
FTCP.Socket.ReadStream(FMSFROMCALL, -1, false); 
FMSFROMCALL.Position := 0; 

답변

7

DefStringEncoding의 과제는 TIdIOHandler.Write(TStream) 방법에 적용되지 않는 클라이언트 측에서 스트림을 읽는 방법이다. 문자열 < -> 바이트 사이를 변환하는 IOHandler 메서드에만 적용되지만 TStream은 이미 원시 바이트이므로 문자열 변환이 필요하지 않습니다.

당신이 시도하고 무엇을 위해, 당신은 TStringList.SaveToStream() 방법에 TEncoding.UTF8 전달해야합니다 당신이 SaveToStream()에 인코딩을 통과하지

LVU := TStringList.Create; 
try 
    LVU.Add('مرحبا'); 
    memorylist := TMemoryStream.Create; 
    try 
    LVU.SaveToStream(memorylist, TEncoding.UTF8); 
    memorylist.Position := 0; 
    AContext.Connection.IOHandler.LargeStream := true; 
    AContext.Connection.IOHandler.Write(memorylist, 0, true); 
    finally 
    memorylist.Free; 
    end; 
finally 
    LVU.Free; 
end; 

, 그것은 기본 인코딩을 사용하여 인코딩됩니다 귀하의 경우 어떤 아랍어를 지원하지 않는 것이므로 ???????의 출처입니다.

대안은 보내는 것입니다 TIdBytes 대신 TMemoryStream (A)의 : DefStringEncoding 할당 그대로 또는 그냥 문자열을 보내

Bytes := IndyTextEncoding_UTF8.GetBytes('مرحبا'); 
AContext.Connection.IOHandler.WriteInt64(Length(Bytes)); 
AContext.Connection.IOHandler.Write(Bytes); 

:

s := 'مرحبا'; 
AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8; 
AContext.Connection.IOHandler.WriteInt64(IndyTextEncoding_UTF8.GetByteCount(s)); 
AContext.Connection.IOHandler.Write(s);