2016-06-22 23 views
4

Ich arbeite mit TStringList mit TMemeorySteam viel in meinem Projekt.Delphi - TStringList Speichern/Laden, um die Codierung zu streamen

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; 

Wie ich die LoadFromStream() und SaveToStream() sagen kann, dass der Stream UTF-16 ist standardmäßig verschlüsselt in meinem Projekt ohne die codierte Art in jedem Aufruf enthält. so kann ich LoadFromStream(msTmp) nur aufrufen und es wird mit UTF-16 codiert laden.

Antwort

6

Werfen Sie einen Blick auf die TStrings.DefaultEncoding Eigenschaft.

Die Standardcodierung für das aktuelle Objekt.

defaulten verwendet, wenn die Null-Codierung in einem Aufruf von LoadFromStream oder SaveToStream angegeben ist.

Standardmäßig ist DefaultEncoding auf Default eingestellt. Der Benutzer kann DefaultEncoding ändern, wenn eine andere Standardcodierung für LoadFromStream oder SaveToStream gewünscht wird.

aber achten Sie auf die TStrings.Encoding Eigenschaft:

Zeichenkodierung beim Lesen aus einem Stream oder eine Datei bestimmt.

Encoding ist eine schreibgeschützte Eigenschaft, die den Wert der Zeichencodierung enthält, die beim Aufruf der Methoden LoadFromStream oder LoadFromFile erkannt wird. Wenn eine Datei oder ein Stream keine Stückliste enthält (der Codierungswert kann nicht erkannt werden), wird Encoding auf den in der Eigenschaft DefaultEncoding angegebenen Wert gesetzt.

Encoding ist in den SaveToStreamSaveToFile und Methoden verwendet.

Wenn der Encoding Parameter [von LoadFromStream] nicht gegeben ist, dann werden die Zeichenketten unter Verwendung der entsprechenden Codierung geladen. Der Wert der Codierung wird durch Aufrufen der GetBufferEncoding-Routine der TEncoding-Klasse erhalten. LoadFromStream speichert dann den Wert der Codierung in der Eigenschaft Encoding, die verwendet werden soll, wenn der Stream gespeichert wird.

Also, solange Sie nicht LoadFrom...() nennen, können Sie DefaultEncoding-TEncoding.Unicode gesetzt und dann SaveTo...() aufrufen, ohne einen Wert für den Encoding Parameter angeben.

Aber, sobald Sie LoadFrom...() nennen, nimmt das Encoding Eigentum Vorrang vor der DefaultEncoding Eigenschaft für nachfolgende Aufrufe von SaveTo...().Solange die Dateien nicht mit der BOM versehen sind, entspricht die Eigenschaft Encoding der Eigenschaft DefaultEncoding. Wenn jedoch eine Nicht-UTF16LE-BOM gefunden wird, sind alle Wetten deaktiviert.

TEncoding.Unicode Um sicherzustellen, dass immer dann verwendet wird, sollten Sie die Encoding Parameter von LoadFrom...() und SaveTo...() weiter zu verwenden, das ist, warum sie existieren. Sie haben die erste Priorität, die (Default)Encoding Eigenschaften sind Rückschläge, wenn Eingabe/Ausgabe-Kodierungen nicht explizit angegeben sind.