Inno Setup - 西里尔字符串显示为问号

Inno Setup - Cyrillic String shows up as question marks

我是运行这个代码:

function CmdLineParamExists(const Value: string): Boolean;
var
  I: Integer;
begin
  Result := False;
  for I := 1 to ParamCount do
  begin
    if CompareText(Copy(ParamStr(I), 1, Length(Value)), Value) = 0 then
    begin
      Result := True;
      Exit;
    end;
  end;
end;

function GetAppName(Value: string): string;
begin
  if CmdLineParamExists('/COMPONENTS=prog2') then
  begin
    Result := 'Программа 2'; //<----This shows up as ????????? 2
  end
    else
  begin
    Result := '{#SetupSetting("AppName")}';
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  S: string;
Begin
if CurPageID = wpSelectDir then
  begin
    S := SetupMessage(msgSelectDirLabel3);
    StringChange(S, '[name]', GetAppName(''));
    WizardForm.SelectDirLabel.Caption := S;
  end;
end;

现在,我不确定自己做错了什么。其他所有字符串都正确显示,除非我使用 GetAppName 的结果。我应该在某个时候将任何内容转换为 AnsiString 吗?

我假设您使用的是 Ansi 版本的 Inno Setup。

在 Ansi 版本中,罪魁祸首可能是 StringChange as it does not play nicely with non-Ansi character sets. Try using StringChangeEx


尽管无论如何您都应该使用 Unicode 版本的 Inno Setup。

只有最新版本的 Inno Setup 5.6 才支持 Unicode 字符串文字。所以请确保您拥有最新版本。


如果您受困于旧版本:

  • 将字符串编码为

    #1F#40#3E#33#40#30#3C#3C#30 + ' 2'
    
  • 或者,实际上最正确的方法是在语言文件中添加新的自定义消息(如Russian.isl):

    [CustomMessages]
    Program2=Программа 2
    

    并像这样加载它:

    CustomMessage('Program2')