2016-06-22 28 views
4

TStringListと私のプロジェクトではTMemeorySteamが多かったです。Delphi - TStringListストリームのエンコードに保存/ロード

msTmp := TMemoryStream.Create; 
    try 
    lTemp.SaveToStream(msTmp, TEncoding.Unicode); 
    finally 
    msTmp.Free; 
    end; 
    ..... 
    lTemp := TStringList.Create; 
    try 
    lTemp.LoadFromFile(msTmp, TEncoding.Unicode); 
    finally 
    lTemp.Free; 
    end; 

私が言うことができるどのようLoadFromStream()とストリームがUTF-16は、各呼び出しでエンコードされたタイプを含めずに私のプロジェクトでは、デフォルトでエンコードされているSaveToStream()。 だから私はLoadFromStream(msTmp)と呼ぶことができ、それはUTF-16でエンコードされて読み込まれます。

答えて

6

TStrings.DefaultEncodingプロパティを見てください。

現在のオブジェクトのデフォルトエンコード。ゼロエンコーディングがLoadFromStreamまたはSaveToStreamへの呼び出しで指定された場合をDefaultEncoding

が使用されます。

デフォルトでは、デフォルトエンコードDefaultに設定されています。 LoadFromStreamまたはSaveToStreamに別のデフォルトのエンコードが必要な場合は、DefaultEncodingを変更できます。

しかし、TStrings.Encodingプロパティに注意:ストリームまたはファイルからの読み込み中に決定

文字エンコーディング。

Encodingは、LoadFromStreamまたはLoadFromFileメソッドが呼び出されたときに検出された文字エンコーディングの値を含む読み取り専用プロパティです。 ファイルまたはストリームにBOMが含まれていない(エンコーディング値を検出できない)場合、EncodingDefaultEncodingプロパティで指定された値に設定されます。

EncodingSaveToStreamSaveToFile方法で使用されています。

[LoadFromStreamの】Encodingパラメータが与えられていない場合、文字列は、適切なエンコーディングを使用してロードされます。エンコーディングの値は、TEncodingクラスのGetBufferEncodingルーチンを呼び出すことによって取得されます。 LoadFromStreamは、ストリームが保存される場合に使用されるEncodingプロパティにエンコーディングの値を保存します。

だから、限り、あなたはLoadFrom...()を呼び出さないように、あなたはTEncoding.UnicodeDefaultEncodingを設定し、Encodingパラメータの値を指定せずにSaveTo...()を呼び出すことができます。

ただし、LoadFrom...()を呼び出すと、その後SaveTo...()を呼び出すときにEncodingプロパティがDefaultEncodingプロパティよりも優先されます。ファイルがBOMされていない限り、EncodingプロパティはDefaultEncodingプロパティと一致します。しかし、非UTF16LE BOMが発生した場合、すべてのベットはオフになります。

TEncoding.Unicodeが常に使用されるようにするには、パラメータをLoadFrom...()SaveTo...()と続けて使用する必要があります。それらが最優先事項です。(Default)Encodingプロパティは、入出力エンコーディングが明示的に指定されていない場合のフォールバックです。

関連する問題