Inno setup Inno安装程序上的按钮被裁剪,一条自定义消息以乱码形式显示(日语)

Inno setup Inno安装程序上的按钮被裁剪,一条自定义消息以乱码形式显示(日语),inno-setup,Inno Setup,在我的[run]部分中,我有以下条目: Filename: "{win}\hh.exe"; \ Parameters: "{app}\MeetSchedAssist.chm::/msa-revision-history.htm"; \ WorkingDir: "{app}"; \ Flags: nowait postinstall runmaximized; \ Description: "{cm:ViewChangeHistory}" 当我用英语运行安装程序时

在我的
[run]
部分中,我有以下条目:

Filename: "{win}\hh.exe"; \
    Parameters: "{app}\MeetSchedAssist.chm::/msa-revision-history.htm"; \
    WorkingDir: "{app}"; \
    Flags: nowait postinstall runmaximized; \
    Description: "{cm:ViewChangeHistory}"
当我用英语运行安装程序时,它看起来很好:

用户刚刚录制了一段视频,将其安装在日本计算机上:

有两个问题:

  • GUI的所有按钮都是裁剪的
  • “查看更改历史记录”自定义字符串是乱七八糟的
  • 英语自定义消息文件(UTF-8编码)具有:

    日文自定义消息文件(UTF-8编码)具有:

    为什么显示不正确?我使用的是Inno Setup Unicode的最新版本。我知道用户使用的是超高清显示器

    此外,我正在重建跑步列表,如下所示:

    type
      TRunEntry = record
        Caption: string;
        Checked: Boolean;
        Object: TObject;
      end;
    
    procedure RebuildRunList;
    var
      RunEntries: array of TRunEntry;
      I: Integer;
    begin
      // Save run list ...
      SetArrayLength(RunEntries, WizardForm.RunList.Items.Count);
      for I := 0 to WizardForm.RunList.Items.Count - 1 do
      begin
        RunEntries[I].Caption := WizardForm.RunList.ItemCaption[I];
        RunEntries[I].Checked := WizardForm.RunList.Checked[I];
        RunEntries[I].Object := WizardForm.RunList.ItemObject[I];
      end;
    
      // ... clear it ... 
      WizardForm.RunList.Items.Clear;
    
      // ... and re-create 
      for I := 0 to GetArrayLength(RunEntries) - 1 do
      begin
        // the first three entries are radio buttons 
        if (I = 0) or (I = 1) or (I = 2) then
        begin
          WizardForm.RunList.AddRadioButton(
            RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, RunEntries[I].Object);
        end
          else
        begin
          WizardForm.RunList.AddCheckBox(
            RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, True, True,
            RunEntries[I].Object);
        end;
      end;
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpFinished then
      begin
        // Only now is the RunList populated.
        // Two entries are on 64-bit systems only.
        if IsWin64 then RebuildRunList;
      end;
    end;
    
    [CustomMessages]
    #include AddBackslash(SourcePath) + ".\l.jpn\CustomMessagesJapanese.txt"
    
    使现代化 我注释掉了重建运行列表的代码,在我的电脑上没有任何区别:

    但是,蒙皮工作正常。因此,按钮位置问题必须与使用超高清配置和/或缩放文本的用户相关

    然后我注释了蒙皮代码,并在我的电脑上重试。没有更改:

    我真的不明白为什么会这样

    使现代化 我包括如下自定义消息:

    type
      TRunEntry = record
        Caption: string;
        Checked: Boolean;
        Object: TObject;
      end;
    
    procedure RebuildRunList;
    var
      RunEntries: array of TRunEntry;
      I: Integer;
    begin
      // Save run list ...
      SetArrayLength(RunEntries, WizardForm.RunList.Items.Count);
      for I := 0 to WizardForm.RunList.Items.Count - 1 do
      begin
        RunEntries[I].Caption := WizardForm.RunList.ItemCaption[I];
        RunEntries[I].Checked := WizardForm.RunList.Checked[I];
        RunEntries[I].Object := WizardForm.RunList.ItemObject[I];
      end;
    
      // ... clear it ... 
      WizardForm.RunList.Items.Clear;
    
      // ... and re-create 
      for I := 0 to GetArrayLength(RunEntries) - 1 do
      begin
        // the first three entries are radio buttons 
        if (I = 0) or (I = 1) or (I = 2) then
        begin
          WizardForm.RunList.AddRadioButton(
            RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, RunEntries[I].Object);
        end
          else
        begin
          WizardForm.RunList.AddCheckBox(
            RunEntries[I].Caption, '', 0, RunEntries[I].Checked, True, True, True,
            RunEntries[I].Object);
        end;
      end;
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpFinished then
      begin
        // Only now is the RunList populated.
        // Two entries are on 64-bit systems only.
        if IsWin64 then RebuildRunList;
      end;
    end;
    
    [CustomMessages]
    #include AddBackslash(SourcePath) + ".\l.jpn\CustomMessagesJapanese.txt"
    

    这取决于你如何包括文本

    在包含MessagesFile的ISL文件中 根据,在UTF-8中保存ISL文件是不合法的

    必须使用文件中指定的代码页将其另存为ANSI编码

    直接在ISS文件中或使用#include 或者,您可以在iss文件中直接使用UTF-8字符串,方法是在本地[Messages]或[CustomMessages]部分直接使用Language.Key值,如下所示:

    [CustomMessages]
    English.ViewChangeHistory=View Change History
    Japanese.ViewChangeHistory=変更履歴を表示
    
    您还可以#包含使用相同格式的外部文件


    在这两种情况下(无论是直接在iss文件中还是在#包含的文件中),您都需要确保文件与BOM一起保存为UTF-8。

    在没有蒙皮机制的情况下会发生这种情况吗?只是为了排除它作为问题的根源。您是否尝试注释掉重建运行列表的代码?您在上面声称已经完成了,但屏幕截图显示的列表显然仍在重建中。@Miral我也很奇怪。但事实证明这并不是问题所在——正如你在回答/评论中提到的,我不得不将编码更改为
    UTF-8bom
    。这不是一个ISL文件。这是一个包含在日语注释中的文本文件。我使用#include语句。你是说任何包含在自定义消息部分的文本文件都需要是ANSI吗?如果是这样,那就是一场噩梦。我有多达50种语言。如果我可以在ISS文件中直接使用Unicode字符串,那么为什么不包括它们呢?稍后我将根据您的答案在脚本中加入文本指导来进行测试。谢谢将更新您。否,#包含文件可以是UTF-8,只要它们是带BOM的UTF-8。ANSI限制适用于MessagesFile指令中包含的ISL文件。您在最初的问题中没有具体说明您是如何做到这一点的。如果您使用香草记事本,请使用文件另存为并选择UTF-8作为编码;它将始终使用BOM表。如果您使用其他编辑器,它可能在其他地方有一个设置;例如,记事本++在状态栏中显示“UTF-8”或“UTF-8无BOM”,您可以在“编码”菜单中对其进行更改。