2016-07-26 4 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; 

IDTCPserverからそれを送ったが、クライアントはそれを受け取るとき、それは???????」として、MS内のテキストをrecive何が問題なの?私は既に接続エンコーディングをutf8に設定しました

私はこのサーバをUbuntu上で実行しています。私が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; 

、そのあなたのケースでアラビア語をサポートしていないので、???????の出所です。

の代替ではなくTMemoryStreamTIdBytesを送信することです:

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); 
関連する問題