【问题标题】:Inno Setup - Cyrillic String shows up as question marksInno Setup - 西里尔字符串显示为问号
【发布时间】:2017-05-26 12:47:28
【问题描述】:

我正在运行这段代码:

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

【问题讨论】:

    标签: inno-setup pascal pascalscript


    【解决方案1】:

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

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


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

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


    如果您被旧版本卡住:

    • 像

      这样对字符串进行编码
      #$041F#$0440#$043E#$0433#$0440#$0430#$043C#$043C#$0430 + ' 2'
      
    • 或者,实际上最正确的方法是在语言文件中添加新的自定义消息(如Russian.isl):

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

      然后像这样加载它:

      CustomMessage('Program2')
      

    【讨论】:

    • 好的...这真是一个惊喜。无论如何,我可以在代码中而不是CustomMessage 中加载组件描述吗?例如在这种情况下,我的组件名称是 prog2,描述是 Программа 2。我想避免定义它两次。
    • 定义描述如{cm:Program2}
    • 好的。所以,我应该反过来解决这个问题。让我们试试吧。
    • 像魅力一样工作。我仍然希望我们可以直接在代码中引用组件描述。事实上,我希望我们可以参考其他部分的所有内容......
    • 那你会如何翻译这些条目?
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2018-02-19
    相关资源
    最近更新 更多