2016-07-26 15 views
2

У меня есть этот код, вставить какую-NONE латинской charcter, а затем отправить его из IDTCPserver Чтобы idTcpclientКак читать нелатинские Charactes внутри потока памяти, отправленные с iDTCPServer?

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; 

, но когда клиент получит его, то получат от текста внутри мса, как «???????» В чем может быть проблема ? Я уже установил кодировку соединения в utf8

Я запустил этот сервер на Ubuntu. Когда я пытаюсь сервер на окнах, я получил текст в обычном режиме.

И это, как я прочитал поток на стороне клиента

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

ответ

7

Ваше назначение DefStringEncoding не относится к методу TIdIOHandler.Write(TStream). Он применяется только к методам IOHandler, которые конвертируют между строками < -> байты, но ваш TStream уже находится в необработанных байтах, поэтому никакого преобразования строк не требуется.

Чтобы сделать то, что вы пытаетесь, вам необходимо пройти TEncoding.UTF8 к TStringList.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; 

Если вы не передать кодировку SaveToStream(), он получает закодирован с использованием кодировки по умолчанию, который в вашем случае это тот, который не поддерживает арабский язык, так что именно там начинается ???????.

Альтернатива отправить TIdBytes вместо TMemoryStream:

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

Или просто отправить строку как есть с DefStringEncoding назначены:

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