2016-06-22 6 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() и SaveToStream() что поток UTF-16 закодированы по умолчанию в моем проекте, не включая закодированную типа в каждом вызове. , поэтому я могу позвонить только LoadFromStream(msTmp), и он будет загружаться с кодировкой UTF-16.

ответ

6

Посмотрите на TStrings.DefaultEncoding.

Кодировка по умолчанию для текущего объекта.

DefaultEncoding используется, когда ноль кодирования задан в вызове LoadFromStream или SaveToStream.

По умолчанию По умолчаниюEncoding установлен в Default. Пользователь может изменить DefaultEncoding, если требуется другое кодирование по умолчанию для LoadFromStream или SaveToStream.

Однако, следить за TStrings.Encoding собственности: кодирование

символов определяется во время чтения из потока или файла.

Encoding - это свойство только для чтения, которое содержит значение кодировки символов, обнаруженное при вызове методов LoadFromStream или LoadFromFile. Если файл или поток не содержит спецификацию (значение кодировки не может быть обнаружено), то Encoding устанавливается в значение, указанное в свойстве DefaultEncoding.

Encoding используется в SaveToStream и SaveToFile методов.

Если параметр [из LoadFromStream] Encoding не задан, то строки загружаются с использованием соответствующего кодирования. Значение кодирования получается путем вызова подпрограммы GetBufferEncoding класса TEncoding. LoadFromStream затем сохраняет значение кодировки в свойстве Encoding, которое будет использоваться, если поток сохранен.

Таким образом, до тех пор, пока вы не звоните LoadFrom...(), вы можете установить DefaultEncoding в TEncoding.Unicode, а затем вызвать SaveTo...() без указания значения для параметра Encoding.

Но после того, как вы позвоните LoadFrom...(), свойство Encoding имеет приоритет над свойством DefaultEncoding для последующих звонков SaveTo...().Пока файлы не BOM'ed, свойство Encoding будет соответствовать свойству DefaultEncoding. Но если встречается не-UTF16LE BOM, все ставки отключены.

Для обеспечения TEncoding.Unicode всегда используется, вы должны продолжать использовать параметр LoadFrom...() и SaveTo...()Encoding, поэтому они существуют. Они принимают первый приоритет, свойства (Default)Encoding являются резервными, когда кодировки ввода/вывода явно не указаны.