Inno Setup:recording/recover UTF8 格式的文件路径
Inno Setup: recording/recover file path in UTF8
我们正在使用 Inno Setup(unicode 版本)为我们的产品创建资源包(或 "samples")。我们产品的程序部分通过样本安装程序编写的文件知道样本的位置。目前,它以简单的方式实现:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if ( CurStep = ssPostInstall) then
begin
ForceDirectories(ExpandConstant('{userappdata}\MyCompany\MyApp'))
SaveStringToFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), ExpandConstant('{app}'), False);
end;
end;
这种简单的方法有一个致命的问题:安装程序是运行中文Windows,所有的东西都是GBK编码,但我们的产品是建立在UTF8基础上的。
经过一番搜索,我通过在 Pascal 代码中调用 Windows WideCharToMultiByte
得到了一些解决方案。但是这行不通,因为它需要 UTF16 作为输入,但我有的是 GBK。
此外,Inno Setup 也无法使用我 SamplePath.txt 中现有的 UTF8 文件名。如果我手动编辑 SamplePath.txt 文件以填充 UTF8 编码的中文字母,并使用以下代码初始化 app
内置函数,它会在目录选择页面中显示乱码:
[Setup]
DefaultDirName={code:GetPreviousSampleDir}
[code]
function GetPreviousSampleDir(Param: String): String;
var
tmp: AnsiString;
begin
if FileExists( ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt') ) then
begin
LoadStringFromFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), tmp)
Result := tmp
end
else
begin
Result := 'D:\MyApp_samples'
end;
end;
那么有什么方法可以 load/store 一个 UTF8 格式的带有 i18n 字符的文件名吗?
要从 UTF-8 文件加载字符串,请使用 LoadStringFromFileInCP
from
const
CP_UTF8 = 65001;
{ ... }
var
FileName: string;
S: string;
begin
FileName := 'test.txt';
if not LoadStringFromFileInCP(FileName, S, CP_UTF8) then
begin
Log('Error reading the file');
end
else
begin
Log('Read: ' + S);
end;
end;
要保存无 BOM 的 UTF-8 文件:
- 要么使用来自同一个问题的
SaveStringsToFileInCP
- 或参见
我们正在使用 Inno Setup(unicode 版本)为我们的产品创建资源包(或 "samples")。我们产品的程序部分通过样本安装程序编写的文件知道样本的位置。目前,它以简单的方式实现:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if ( CurStep = ssPostInstall) then
begin
ForceDirectories(ExpandConstant('{userappdata}\MyCompany\MyApp'))
SaveStringToFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), ExpandConstant('{app}'), False);
end;
end;
这种简单的方法有一个致命的问题:安装程序是运行中文Windows,所有的东西都是GBK编码,但我们的产品是建立在UTF8基础上的。
经过一番搜索,我通过在 Pascal 代码中调用 Windows WideCharToMultiByte
得到了一些解决方案。但是这行不通,因为它需要 UTF16 作为输入,但我有的是 GBK。
此外,Inno Setup 也无法使用我 SamplePath.txt 中现有的 UTF8 文件名。如果我手动编辑 SamplePath.txt 文件以填充 UTF8 编码的中文字母,并使用以下代码初始化 app
内置函数,它会在目录选择页面中显示乱码:
[Setup]
DefaultDirName={code:GetPreviousSampleDir}
[code]
function GetPreviousSampleDir(Param: String): String;
var
tmp: AnsiString;
begin
if FileExists( ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt') ) then
begin
LoadStringFromFile(ExpandConstant('{userappdata}\MyCompany\MyApp\SamplePath.txt'), tmp)
Result := tmp
end
else
begin
Result := 'D:\MyApp_samples'
end;
end;
那么有什么方法可以 load/store 一个 UTF8 格式的带有 i18n 字符的文件名吗?
要从 UTF-8 文件加载字符串,请使用 LoadStringFromFileInCP
from
const
CP_UTF8 = 65001;
{ ... }
var
FileName: string;
S: string;
begin
FileName := 'test.txt';
if not LoadStringFromFileInCP(FileName, S, CP_UTF8) then
begin
Log('Error reading the file');
end
else
begin
Log('Read: ' + S);
end;
end;
要保存无 BOM 的 UTF-8 文件:
- 要么使用来自同一个问题的
SaveStringsToFileInCP
- 或参见