При работе с файлами в формате UTF-16LE в среде разработки Delphi XE3, пользователи могут столкнуться с проблемой появления BOM (Byte Order Mark) перед каждой сериализованной строкой. Это может быть нежелательным поведением, если в файле уже присутствует BOM, добавленный программой пользователя, и не требуется его дублирование.
Проблема
Пользователь использует компонент TStringList для сохранения строк в поток файла, который уже содержит BOM. При вызове метода SaveToStream для каждого экземпляра TStringList происходит добавление нового BOM, что приводит к ненужному дублированию маркера порядка байт в файле.
Контекст
В коде пользователя создается поток файла TFileStream для записи данных и содержимого TStringList в формате UTF-16LE. При записи нескольких TStringList в один поток, перед каждым списком строк добавляется BOM, что приводит к нежелательному результату.
FileStream := TFileStream.Create('D:\MyFile.dat', fmCreate or fmOpenWrite or fmShareExclusive);
try
// Запись некоторых данных в FileStream
// Запись содержимого StringList1 в FileStream
StringList1.SaveToStream(FileStream, TEncoding.Unicode);
// Запись дополнительных данных в FileStream
// Запись содержимого StringList2 в FileStream
StringList2.SaveToStream(FileStream, TEncoding.Unicode);
finally
FileStream.Free;
end;
Подтвержденное решение
Для решения проблемы можно использовать свойство WriteBOM компонента TStrings. Установив его в False, можно исключить добавление BOM перед каждой сериализованной строкой.
Использование метода SaveToStream с записью в TMemoryStream, последующим пропуском BOM и копированием данных в TFileStream.
Создание собственного класса кодирования, наследуемого от SysUtils.TUnicodeEncoding, с переопределением метода GetPreamble для исключения добавления BOM.
Заключение
Для избежания дублирования BOM в файле, рекомендуется использовать свойство WriteBOM компонента TStringList. Это простое и эффективное решение позволит избежать нежелательного поведения и обеспечит корректную запись данных в файлы UTF-16LE.
Пользователь сталкивается с проблемой добавления BOM при записи данных в файлы UTF-16LE с использованием компонента `TStringList` в Delphi XE3 и ищет способ исключить это поведение.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.