Unicode Inno设置:在UTF8中录制/恢复文件路径

Unicode Inno设置:在UTF8中录制/恢复文件路径,unicode,internationalization,inno-setup,gbk,Unicode,Internationalization,Inno Setup,Gbk,我们正在使用Inno Setup unicode版本为我们的产品创建资源包或示例。我们产品的程序部分通过样本安装程序编写的文件知道样本的位置。目前,它是以简单的方式实现的: procedure CurStepChanged(CurStep: TSetupStep); begin if ( CurStep = ssPostInstall) then begin ForceDirectories(ExpandConstant('{userappdata}\MyCompany\MyAp

我们正在使用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;
这种简单的方式有一个致命的问题:安装程序是在中文窗口中运行的,所有的东西都使用GBK编码,但是我们的产品是基于UTF8构建的

经过一些搜索,我通过在Pascal代码中调用Windows WideChartMultiByte获得了一些解决方案。然而,这将不起作用,因为它需要UTF16作为输入,但我拥有的是GBK

此外,Inno安装程序也无法使用my SamplePath.txt中现有的UTF8文件名。如果我手动编辑SamplePath.txt文件以填充UTF8编码的中文字母,并使用以下代码初始化应用程序内置,它会在目录选择页面中显示混乱的字符:

[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个字符的文件名?

要从UTF-8文件加载字符串,请使用LoadStringFromFileInCP from

常数 CP_UTF8=65001; { ... } 变量 文件名:字符串; S:字符串; 开始 文件名:=“test.txt”; 如果未从文件incpfilename、S、CP\u UTF8加载stringfrom,则 开始 日志“读取文件时出错”; 终止 其他的 开始 日志“读取:”+S; 终止 终止 要保存不带BOM表的UTF-8文件,请执行以下操作:

使用同一问题的SaveStringsToFileInCP 或者看
您使用的是Unicode还是Ansi Inno设置?@MartinPrikryl:是的,Unicode版本,我将在问题后面附加这些信息。好的,请解释一下您所说的GBK编码中的全部工作是什么意思-从哪里获得GBK编码?+您尝试过SaveStringsToUTF8File吗?@MartinPrikryl SaveStringsToUTF8File将使用不需要的BOM进行写入。此外,加载部分仍然存在问题。@MartinPrikryl如果不使用UTF8调用,它将生成带有GBK的内容,并且它可以加载GBK编码的文件名并在目录选择页面中正确显示。由于现代Windows在UTF16中工作,Inno安装程序的内部似乎使用传统的本地代码页运行。我在两个方向上都使用了Windows API,并且工作正常。谢谢!