我有一个从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)并转到安装文件夹.
他们是:
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))后将其记录下来.