procedure SwapWideChars(p: PWideChar);
begin
while p^ <> #0000 do
begin
p^ := WideChar(Swap(Word(p^)));
Inc(p);
end;
end;
var
ms: TMemoryStream;
wc: WideChar;
pWc: PWideChar;
begin
ms := TMemoryStream.Create;
try
ms.LoadFromFile(filename);
ms.Seek(0, soFromend);
wc := #0000;
ms.Write(wc, sizeof(wc));
pWC := ms.Memory;
if pWc^ = #$FEFF then {normal byte order mark}
Inc(pWc)
else if pWc^ = #$FFFE then
begin {byte order is big-endian}
SwapWideChars(pWc);
Inc(pWc);
end
else
; {no byte order mark}
strings.Text := WideChartoString(pWc);
finally
ms.free;
end;
end;
Код, который вы предоставили, предназначен для загрузки файлов с кодировкой Юникод в объект TStrings, который может быть использован для заполнения компонента TMemo в приложении Delphi.
Вот шаг за шагом, что делает этот код:
Процедура LoadUnicodeFile принимает два параметра: filename, которое является путем к файлу, который нужно загрузить, и strings, которое является объектом TStrings, который будет содержать содержимое файла.
Процедура создает объект TMemoryStream (ms) и загружает файл в него с помощью метода LoadFromFile.
Затем она перемещается к концу потока с помощью метода Seek с параметром soFromEnd, эффективно позиционируя поток на начало файла.
Процедура записывает одиночный Юникод- символ (#0000) в поток, который используется как маркер для обнаружения знака начала файла (BOM) в файле.
Затем она перемещается назад к началу файла с помощью метода Seek с параметром soFromBeginning и получает указатель на буфер памяти (pWC) с помощью свойства Memory.
Код проверяет, есть ли BOM в начале файла, сравнивая его с либо #$FEFF (UTF-16 little-endian) или #$FFFE (UTF-16 big-endian). Если он находит BOM, он меняет порядок байтов с помощью процедуры SwapWideChars.
Наконец, код конвертирует буфер памяти в строку с помощью функции WideChartoString и присваивает ее свойству Text объекта TStrings.
Чтобы использовать этот код, просто вызовите процедуру LoadUnicodeFile с желаемым путем к файлу и свойством Lines компонента TMemo в качестве аргументов:
LoadUnicodeFile('path/to/file.txt',memo1.Lines);
Это загрузит содержимое файла в компонент memo1.
Обратите внимание, что этот код предполагает, что файлы содержат текст Юникод, закодированный в UTF-16 с BOM. Если ваши файлы используют другую кодировку, вам может потребоваться изменить код соответствующим образом.
Данное описание статьи в русском языке: Загрузка юникодов в мемо-объект при помощи процедуры LoadUnicodeFile, позволяющей безопасно и эффективно конвертировать файлы с юникодными символами в строковые переменные.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.