2016-07-26 26 views
2

Ich habe diesen Code, dass einige keine lateinische charcter einfügen und es dann zu idTcpclientWie lese ich nicht lateinische Charactes im Speicher-Stream, der von iDTCPServer gesendet wurde?

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; 

von IDTCPserver senden, aber wenn Kunde sie empfangen, den Text innerhalb ms als recive ‚???????‘ Was könnte das Problem sein? Ich habe bereits die Verbindungscodierung zu utf8

Ich betreibe diesen Server auf Ubuntu. Wenn ich den Server unter Windows ausprobiere, habe ich den Text normal bekommen.

Und das ist, wie ich Stream auf Client-Seite lesen

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

Antwort

7

Ihre Zuordnung von DefStringEncoding gilt nicht für die TIdIOHandler.Write(TStream) Methode. Es gilt nur für IOHandler-Methoden, die zwischen Zeichenfolge < -> Bytes konvertieren, aber Ihre TStream ist bereits in rohen Bytes, also ist keine Zeichenfolge Konvertierung beteiligt.

zu tun, was Sie versuchen, müssen Sie TEncoding.UTF8 zum TStringList.SaveToStream() Methode zu übergeben:

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; 

Wenn Sie eine Standard-Kodierung keine Codierung SaveToStream() passiert, wird es verschlüsselt verwenden, die in Ihrem Fall ist eine, die nicht Arabisch unterstützt, so dass die ??????? stammt.

Eine Alternative ist ein senden TIdBytes anstelle eines TMemoryStream:

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

Oder nur die Zeichenfolge senden mit DefStringEncoding als Service-Leistung zugewiesen:

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