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')
我是运行这个代码:
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')