Inno Setup Pascal Script - 读取UTF-16文件

时间:2016-10-04 04:26:39

标签: inno-setup utf-16 pascalscript

我有一个从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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

该文件采用UTF-16 LE编码。

LoadStringFromFile不支持任何Unicode编码。它按原样将文件加载到字节数组(AnsiString实际上用作字节数组)。

由于Unicode string(在Unicode version of Inno Setup中)实际使用UTF-16 LE编码,您需要做的就是将字节数组按位逐位复制到(Unicode){{1 }}。并修剪UTF-16 LE BOMstring)。

FEFF

另见Inno Setup Reading file in Ansi and Unicode encoding

答案 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。

enter image description here

下载后,安装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字符串后将其记录下来。