inno-setup – Inno Setup Pascal Script – 读取UTF-16文件

前端之家收集整理的这篇文章主要介绍了inno-setup – Inno Setup Pascal Script – 读取UTF-16文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个从Resource Hacker导出的.inf文件.该文件采用UTF-16 LE编码.
EXTRALARGELEGENDSII_INI TEXTFILE "Data.bin"

LARGEFONTSLEGENDSII_INI TEXTFILE "Data_2.bin"

NORMALLEGENDSII_INI TEXTFILE "Data_3.bin"

THEMES_INI TEXTFILE "Data_4.bin"

当我使用LoadStringFromFile function加载它时:

procedure LoadResources;
var
  RESOURCE_INFO: AnsiString;
begin
  LoadStringFromFile(ExpandConstant('{tmp}\SKINRESOURCE - INFO.inf'),RESOURCE_INFO);
  Log(String(RESOURCE_INFO));
end;

我在调试输出中得到这个:

E

请告诉我如何解决这个问题.

提前致谢.

解决方法

您尝试记录的文件似乎是Windows Unicode(UTF-16LE)编码文本文件.

您可以使用iConv命令行并将文件转换为Windows UTF-8编码文件.

LoadStringFromFile Support Function不能很好地加载Unicode字符串,它只支持加载ANSI和UTF-8编码文本文件.

Inno Setup编译器调试输出停止记录文本文件,因为它找到了一个无法加载的字符(NULL),这就是为什么在编译器调试输出中只得到“E”,即使LoadStringFromFile完全加载文本文件.

您需要下载iConv的安装程序,如下所示,以获取iConv可执行文件和一些用于在字符编码之间进行转换的DLL.

下载后,安装GnuWin32(适用于Windows的LibIconv)并转到安装文件夹.

复制安装文件夹“bin”中子目录内的四个文件.

他们是:

libcharset1.dll

libiconv2.dll

iconv.exe

libintl3.dll

将这些文件复制到存储Inno Setup Project文件的目录中.

然后使用以下代码进行转换.

[Files]
Source: "libcharset1.dll"; Flags: dontcopy
Source: "iconv.exe"; Flags: dontcopy
Source: "libiconv2.dll"; Flags: dontcopy
Source: "libintl3.dll"; Flags: dontcopy

[Code]
function InitializeSetup(): Boolean
var
  ErrorCode: Integer;
begin
  ExtractTemporaryFile('iconv.exe');
  ExtractTemporaryFile('libcharset1.dll');
  ExtractTemporaryFile('libintl3.dll');
  ExtractTemporaryFile('libiconv2.dll');
  ShellExec('Open',ExpandConstant('CMD.exe'),ExpandConstant('/C iConv -f UTF-16LE -t UTF-8 < SKINRESOURCE-INFO.inf > SKINRESOURCE-INFO-ANSI.inf'),ExpandConstant('{tmp}'),SW_HIDE,ewWaitUntilTerminated,ErrorCode); 
  DeleteFile(ExpandConstant('{tmp}\SKINRESOURCE-INFO.inf'));

现在,LoadStringFromFile应该正确加载文本文件,因为它现在具有Windows UTF-8编码.

如果您使用的是Unicode Inno Setup,也可以在将其转换为Unicode字符串(如Log(String(RESOURCE_INFO))后将其记录下来.

猜你在找的Delphi相关文章