Topic: Как записать из Memo файл в кодировке UTF-8 без BOM

При выполнении метода Memo.SaveToFileUTF8 записывается файл в кодировке UTF8 с меткой кодировки BOM в начале файла.
Есть ли способ отключить эту метку при сохранении в UTF8?
Или можно ли как-то избавиться от этой метки после сохранения?
Т.е. нужен файл в кодировке UTF8, но без метки BOM.

Re: Как записать из Memo файл в кодировке UTF-8 без BOM

Иначе говоря: как удалить из файла три байта?


Задайте свой вопрос в этом топике: http://myvisualdatabase.com/forum/viewtopic.php?id=6019


Там обсуждается побайтная обработка файлов и vovka3003 сможет вам помочь, если вы ваш файл выдадите за бинарный ))))

Визуальное программирование: блог и телеграм-канал.

3 (edited by vovka3003 2021-02-17 13:27:57)

Re: Как записать из Memo файл в кодировке UTF-8 без BOM

В конкретном случае понятно, что это текстовик в UTF8.

    
function ClearBOM(FileName:string):boolean;
var s,sr:string;
    FS:TFileStream;
    MS:TMemoryStream;
    i:integer;
    res:boolean;
    bom:array [0..2] of byte;
begin
try
    result:=false;
    FS:=TFileStream.Create(FileName,fmOpenRead);
    if FS.Size < 3 then
    begin
        result := true;
        exit;
    end;
    SetLength(sr,3);
    for i:=0 to 2 do
    begin
        FS.Position:=i;
        FS.Read(s,1);
        sr[i+1]:=s;
    end;
    res := (sr[1] = chr($EF)) and
           (sr[2] = chr($BB)) and
           (sr[3] = chr($BF));
    if res then
        begin
           MS:=TMemoryStream.Create;
           MS.CopyFrom(FS,FS.Size-3);
           FS.Free;
           FS:=nil;
           MS.SaveToFile(FileName);
        end;
    result := true;
finally
    if MS <> nil then MS.Free;
    if FS <> nil then FS.Free;

end;
end; 

Re: Как записать из Memo файл в кодировке UTF-8 без BOM

vovka3003 wrote:

В конкретном случае понятно, что это текстовик в UTF8.

Вот где собака (побайтной обработки файла) зарыта:

FS.Read(s,1);

Переменная s строковая (TWideString), а чтение побайтовое!

Могу предположить, что если там окажется значение $0, то получим пустую строку, а это тоже можно обработать.

Визуальное программирование: блог и телеграм-канал.

5 (edited by vovka3003 2021-02-19 06:13:21)

Re: Как записать из Memo файл в кодировке UTF-8 без BOM

k245 wrote:

Могу предположить, что если там окажется значение $0, то получим пустую строку, а это тоже можно обработать.

В конкретной процедуре задача найти и убрать bom по точному совпадению набора байт (вернее - скопировать в другой файл без них). Иначе - ничего не делаем.

Можно еще использовать AdoDb.Stream для чтения/изменения бинарников. Или WIA.ImageFile для картинок. Все зависит от задачи.