2017-11-10 33 views
0

ファイルがTMemoryStreamで開かれています。現在のエンコーディングはBOM付きのANSIまたはUTF8にすることができます。 TMemoryStreamのエンコーディングをUTF8に変換する必要があります。それ、どうやったら出来るの?TMemoryStreamのエンコードをutf8に変換する

+1

明らかにしましょう。効率性を気にする人は、変換する前にそれをメモリに読み込むのはなぜですか?古典的な間違いは、 'TMemoryStream'が重要な' TStream'の唯一の実装だと考えることです。効率が重要なのであれば、確実に 'TFileStream'を使って読み込み、変換してから' TMemoryStream'に書き込みたいと思っています。中間の男を切り取ってください。あなたがディスクから読んでいるなら、ディスクアクセスが支配的であり、残りのプロセスを無関係にすることをお勧めします。最後に、パフォーマンスに関するアドバイスを行うには、使用方法の詳細な知識が必要です。私たちはそれを持っていません。 –

+0

TEncoding.UTF8を見てください。 –

+0

DavidとRudyに感謝します。私のファイルはすでにmemorystreamで開かれています。私はそれを変更することはできません。私はそれをエンコーディングに変換する必要があります。 utf8に変換した後、いくつかの変更を加えて元のエンコーディングでディスクに再度保存する必要があります。これは、拡張文字がファイルを破壊するのを止めるために行われています。 – user3857505

答えて

2

TMemoryStreamを子孫TBytesStreamに変更できる場合は、Convertという機能をTEncodingから使用できます。それが最も効率的な方法ですが、少なくともそれは一つの方法であり、それが唯一の順番にも効率のいくつかの並べ替えである行のカップルを、必要がある場合

var 
    stream: TBytesStream; 
    bytes: TBytesStream; 
    ... 
    TEncoding.GetBufferEncoding(stream.Bytes, curEncoding); 
    if curEncoding <> TEncoding.UTF8 then begin 
    bytes := TEncoding.Convert(curEncoding, TEncoding.UTF8, stream.Bytes); 
    stream.Free; 
    stream := TBytesStream.Create(bytes); 
    end; 

わかりません。

+0

大きなファイルではあまり効率的ではありませんので、小さなファイルで作業してください。また、 'GetBufferEncoding()'がBOMを検出しない場合は、OSのデフォルトのANSI文字セットを表す 'TEncoding.Default'を返します。これは、ファイルのANSIエンコーディングと同じでないかもしれません。 'TEncoding'は実際のANSI文字セットを実際に検出することができません。これはヒューリスティックを実行しないためです。それが重要な場合は、手動で行う必要があります。 –

+0

こんにちはUwe。この行は機能しません:stream.Bytes:= TEncoding.Convert(curEncoding、TEncoding.UTF8、stream.Bytes); stream.Bytesは読み取り専用です。 – user3857505

+0

確かに!私はそれをカバーするコードを変更しました。 –

関連する問題