Inno Setup - Cyrillic String显示为问号

时间:2017-05-26 12:47:29

标签: inno-setup pascal pascalscript

我正在运行此代码:

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吗?

1 个答案:

答案 0 :(得分:2)

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

在Ansi版本中,罪魁祸首可能是StringChange,因为它与非安西字符集不能很好地配合。尝试使用StringChangeEx

尽管你应该使用Inno Setup的Unicode版本。

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

如果您遇到旧版本:

  • 对字符串进行编码,如

    #$041F#$0440#$043E#$0433#$0440#$0430#$043C#$043C#$0430 + ' 2'
    
  • 或者,实际上最正确的方法是向语言文件添加新的自定义消息(例如Russian.isl):

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

    然后加载它:

    CustomMessage('Program2')