Inno Setup:在UTF8中记录/恢复文件路径

时间:2019-05-10 06:01:22

标签: unicode internationalization inno-setup gbk

我们正在使用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构建。

搜索后,我通过在Pascal代码内调用Windows WideCharToMultiByte得到了一些解决方案。但是,这不起作用,因为它需要输入UTF16,但是我所拥有的是GBK。

此外,Inno Setup也无法与我的 SamplePath.txt 中的现有UTF8文件名一起使用。如果我手动编辑 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;

那么有什么方法可以在UTF8中加载/存储带有i18n字符的文件名?

1 个答案:

答案 0 :(得分:1)

要从UTF-8文件加载字符串,请使用
中的dependencies { testImplementation "android.arch.core:core-testing:1.0.0" } Inno Setup - Convert array of string to Unicode and back to ANSI

InstantTaskExecutorRule

要保存不含BOM的UTF-8文件: