異なるOS地域の言語でTStringStream
エンコーディングの問題があります。データ文字列を読み取るTStringStreamから
イメージデータを転送しようとしています。私はそれ以前に問題を抱えていましたが、それは別の質問で解決されました。
今はTStringStream
にエンコードの問題があります。オペレーティングシステムの地域言語が英語に設定されている場合は、TStringStream
からデータが破損します。
言語をアラビア語に変更すると、データが正しく出力されます。
現在、Indyを使用してバイナリデータをエンコードしていますが、エンコードを開始する前に、地域コードがアラビア語に設定されていないと、StringStream.DataString
のデータは既に破損しています。 TEncoding.UTF8
をTStringStream.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;
...
を、インディは( 'WriteStringToStreamを持っています) 'と' WriteMemoryStreamToStream() '関数は、' IdGlobal'ユニットの中で機能します。 –
これもオプションです。 – smooty86
ストリームを保持する文字列は次のようになります。 'strcams:= IntToStr(Length(StringImageData))+ StringImageData;'? 'intTostr(memorystream.size)'は、jpg.sizeでなければなりません。 –