Создайте файл UTF8 без спецификации с помощью Inno Setup (версия Unicode)

Я должен прочитать и изменить некоторые файлы JSON. Кодировка файла должна быть UTF8 без спецификации, иначе файл JSON не будет принят.

Я попробовал следующий код:

const
    Utf8Bom     = #$EF#$BB#$BF;
    Utf16BomLE  = #$FF#$FE;                 // little endian // 
    Utf16BomBE  = #$FE#$FF;                 // big endian // 
    Utf16Bom    = Utf16BomBE;
    CP_UTF16    = 1200;
    CP_UTF8     = 65001;

function WideStringToString (const wStr: string; codePage: Word): string;
var
    len: Integer;
begin
    len := WideCharToMultiByte (codePage, 0, wStr, -1, '', 0, 0, 0);
    if len > 0 then
    begin
        SetLength (Result, len-1);
        WideCharToMultiByte (codePage, 0, wStr, -1, Result, Length (Result), 0,  0);
    end;
end;

function ClearBom(const s, sig: string): string;
var
    i, n, len: Integer;
begin
    Result := s;
    len := Length (sig);
    n := 0;
    if (len> 0) and (Length (Result)> len) then
        repeat
            for i := 1 to len do
                if Result [1] = sig [i] then
                begin
                    Delete (Result, 1, 1);
                    Break;
                end;
            n := n + 1;
        until (n = len) or (Result = '');
end;

function ConvertUtf16(const SourceStr: string; codePage: Word): string;
var
    wStr: string;
begin
    try
        wStr := ClearBom(SourceStr, Utf16Bom);
        Result := WideStringToString(wStr, codePage);
    finally
        SetLength(wStr, 0);
    end;
end;

function Utf16ToUtf8(const SourceStr: string): string;
begin
    Result := ConvertUtf16(SourceStr, CP_UTF8);
end;

function JSONSaveFile(const Filename: String; s: String): Boolean;
var
    fs: TFileStream;
    i, len : Integer;
begin
    i := 1;
    len := Length(s)
    If len > 0 then
    begin
        try
            try
                fs := TFileStream.Create(Filename, fmCreate or f mShareExclusive);
                fs.Seek(0, 0);
                while (s[i] <> #0) and (i < len) do
                begin
                    fs.WriteBuffer(s[i],CharLength(s,i));
                    i := i + CharLength(s,i);
                end;
                Result := True;
            except
                Log('EXCEPTION RAISED in JSONSaveFile: '+Filename);
            end;
        finally
            fs.free;
        end;
    end;
end;

Я получаю только файлы в кодировке ANSI. Встроенные функции, такие какSaveStringsToUTF8File() Функция не будет работать, потому что спецификация добавлена ​​по умолчанию.

Или это лучший способ сохранить / создать этот текстовый файл сSaveStringToFile()?

Как это решить?

Ответы на вопрос(1)

Ваш ответ на вопрос