Inno Setup: запись / восстановление пути к файлу в UTF8 - PullRequest
0 голосов
/ 10 мая 2019

Мы используем Inno Setup (Unicode-версия) для создания пакета ресурсов (или «примеров») для нашего продукта. Программная часть нашего продукта знает расположение образцов по файлу, который записывается установщиком образцов. На данный момент это реализовано простым способом:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if ( CurStep = ssPostInstall) then
  begin
    ForceDirectories(ExpandConstant('{userappdata}\MyCompany\MyApp'))
    SaveStringToFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), ExpandConstant('{app}'), False);
  end;
end;

У этого простого способа есть фатальная проблема: установщик запускается на китайском языке Windows, и все это работает в кодировке GBK, но наш продукт построен на базе UTF8.

После некоторого поиска я нашел решение, вызвав Windows WideCharToMultiByte внутри кода Pascal. Однако это не сработает, поскольку требует ввода UTF16, но у меня есть GBK.

Кроме того, Inno Setup также не будет работать с существующим именем файла UTF8 в моем SamplePath.txt . Если я вручную отредактирую файл SamplePath.txt , чтобы заполнить китайские буквы в кодировке UTF8, и инициализирую встроенный код app с помощью следующего кода, он отобразит грязные символы на странице выбора каталога:

[Setup]
DefaultDirName={code:GetPreviousSampleDir}

[code]
function GetPreviousSampleDir(Param: String): String;
var
    tmp: AnsiString;
begin
    if FileExists( ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt') ) then
    begin
        LoadStringFromFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), tmp)
        Result := tmp
    end
    else
    begin
        Result := 'D:\MyApp_samples'
    end;
end;

Так есть ли способ загрузить / сохранить имя файла с символами i18n в UTF8?

1 Ответ

1 голос
/ 10 мая 2019

Чтобы загрузить строку из файла UTF-8, используйте LoadStringFromFileInCP из
Inno Setup - преобразование массива строк в Unicode и обратно в ANSI

const
  CP_UTF8 = 65001;

{ ... }
var
  FileName: string;
  S: string;
begin
  FileName := 'test.txt';
  if not LoadStringFromFileInCP(FileName, S, CP_UTF8) then
  begin
    Log('Error reading the file');
  end
    else
  begin
    Log('Read: ' + S);
  end;
end;

Чтобы сохранить файл UTF-8 без спецификации:

...