我有一个从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"
加载时
procedure LoadResources;
var
RESOURCE_INFO: AnsiString;
begin
LoadStringFromFile(ExpandConstant('{tmp}\SKINRESOURCE - INFO.inf'), RESOURCE_INFO);
Log(String(RESOURCE_INFO));
end;
我在调试输出:
中得到了这个E
请告诉我如何解决这个问题。
提前致谢。
答案 0 :(得分:3)
该文件采用UTF-16 LE编码。
LoadStringFromFile
不支持任何Unicode编码。它按原样将文件加载到字节数组(AnsiString
实际上用作字节数组)。
由于Unicode string
(在Unicode version of Inno Setup中)实际使用UTF-16 LE编码,您需要做的就是将字节数组按位逐位复制到(Unicode){{1 }}。并修剪UTF-16 LE BOM(string
)。
FEFF
答案 1 :(得分:0)
您尝试记录的文件似乎是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,也可以在将其转换为Log(String(RESOURCE_INFO))
之类的Unicode字符串后将其记录下来。