2017-05-26 26 views
0

我运行这段代码:Inno Setup的 - 西里尔字符串显示为问号

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

回答

2

我假设你使用Ansi版本的Inno Setup。因为在Unicode版本中,不支持Unicode字符串文字。

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


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

虽然,如记录,neither Unicode version of Inno Setup supports Unicode string literals

由Unicode编译器中使用的新的RemObjects PascalScript版本支持Unicode,但不为它的输入源。这意味着它确实使用了Unicode字符串类型,但脚本中的任何文字Unicode字符将被转换为ANSI。这并不意味着您不能显示Unicode字符串:例如,您可以使用编码的Unicode字符来构建Unicode字符串(如S := #$0100 + #$0101 + 'Aa';),也可以使用LoadStringsFromFile或使用{cm:...}常量从文件加载字符串。


所以,你可以做什么:

  • 编码字符串如

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

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

    并加载它想:

    CustomMessage('Program2') 
    
+0

OK ......这是一个惊喜。无论如何,我可以在代码中加载组件描述而不是'CustomMessage'吗?例如在这种情况下,我的组件名是'prog2',描述是'Программа2'。我想避免定义两次。 –

+0

定义类似'{cm:Program2}的描述' –

+0

OK。所以,我应该用另一种方式来解决问题。咱们试试吧。 –