2016-09-13 17 views
0

異なるOS地域の言語でTStringStreamエンコーディングの問題があります。データ文字列を読み取るTStringStreamから

イメージデータを転送しようとしています。私はそれ以前に問題を抱えていましたが、それは別の質問で解決されました。

今はTStringStreamにエンコードの問題があります。オペレーティングシステムの地域言語が英語に設定されている場合は、TStringStreamからデータが破損します。

言語をアラビア語に変更すると、データが正しく出力されます。

現在、Indyを使用してバイナリデータをエンコードしていますが、エンコードを開始する前に、地域コードがアラビア語に設定されていないと、StringStream.DataStringのデータは既に破損しています。 TEncoding.UTF8TStringStream.Create()に追加しようとしましたが、データはまだStringStream.DataStringから間違っています。

function Encode64(const S: string; const ByteEncoding: IIdTextEncoding = nil): string; 
begin 
    Result := TIdEncoderMIME.EncodeString(S, ByteEncoding); 
end; 

function Decode64(const S: string; const ByteEncoding: IIdTextEncoding = nil): string; 
begin 
    Result := TIdDecoderMIME.DecodeString(S, ByteEncoding); 
end; 

StringStream := TStringStream.Create(''); 
try 
    Jpg.Performance := jpBestSpeed; 
    Jpg.ProgressiveEncoding := True; 
    Jpg.ProgressiveDisplay := True; 
    jpg.Assign(Image2.Picture.Bitmap); 
    jpg.CompressionQuality := 25; 
    jpg.Compress; 
    jpg.SaveToStream(StringStream); 
    StringImageData := StringStream.DataString; // the data here is corrupted when Os region is not set to arabic 
    strcams := '<[S:' + IntToStr(Length(StringImageData)) + 'B]>' + StringImageData; 
    if length(strcams) < byt then begin 
    Sendimgdata('IMGDATA123', Encode64(strcams, IndyTextEncoding_UTF8) + sep); 
    end; 
    ... 

答えて

4

最初にTStringStreamにJPGを保存することはできません。最初に文字列に変換せずにバイナリデータをエンコードする必要があり、データが破損します。バイナリデータの代わりにTMemoryStreamを使用してください:

MemoryStream := TMemoryStream.Create; 
... 
jpg.SaveToStream(MemoryStream); 
MemoryStream.Position := 0; 
StringImageData := TIdEncoderMIME.EncodeStream(MemoryStream); 
... 

あなたは長さのテキストを挿入した後にエンコードしたい場合は、あなたもTMemoryStreamと仕事をしなければならない:FYI

procedure StringToStream(aStream: TStream; const aString: AnsiString); 
begin 
    aStream.Write(PAnsiChar(AString)^, Length(AString)); 
end; 

... 

JpegStream := TMemoryStream.Create; 
jpg.SaveToStream(JpegStream); 

CompleteStream := TMemoryStream.Create; 
StringToStream(CompleteStream, '<[S:' + IntToStr(JpegStream.Size)+'B]>'); 

CompleteStream.CopyFrom(JpegStream, 0); 
StringImageData := TIdEncoderMIME.EncodeStream(CompleteStream); 
+1

を、インディは( 'WriteStringToStreamを持っています) 'と' WriteMemoryStreamToStream() '関数は、' IdGlobal'ユニットの中で機能します。 –

+0

これもオプションです。 – smooty86

+0

ストリームを保持する文字列は次のようになります。 'strcams:= IntToStr(Length(StringImageData))+ StringImageData;'? 'intTostr(memorystream.size)'は、jpg.sizeでなければなりません。 –

関連する問題