在Inno Setup Pascal脚本中读取UTF-16文件

Blu*_*789 4 inno-setup utf-16 pascalscript

我有一个.inf从 Resource Hacker 导出的文件。该文件采用 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" 
Run Code Online (Sandbox Code Playgroud)

当我使用该LoadStringFromFile函数加载它时:

EXTRALARGELEGENDSII_INI TEXTFILE "Data.bin"

LARGEFONTSLEGENDSII_INI TEXTFILE "Data_2.bin"

NORMALLEGENDSII_INI TEXTFILE "Data_3.bin"

THEMES_INI TEXTFILE "Data_4.bin" 
Run Code Online (Sandbox Code Playgroud)

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

E
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

Mar*_*ryl 5

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

\n

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

\n

由于 Unicode stringInno Setup \xe2\x80\x93 的 Unicode 版本是 Inno Setup 6 中唯一的版本)实际上使用 UTF-16 LE 编码,因此您需要做的就是将字节数组按位复制到 (Unicode )string。并修剪UTF-16 LE BOM ( FEFF)。

\n
procedure RtlMoveMemory(Dest: string; Source: PAnsiChar; Len: Integer);\n  external \'RtlMoveMemory@kernel32.dll stdcall\';\n\nfunction LoadStringFromUTF16LEFile(FileName: string; var S: string): Boolean;\nvar\n  A: AnsiString;\nbegin\n  Result := LoadStringFromFile(FileName, A);\n  if Result then\n  begin\n    SetLength(S, Length(A) div 2);\n    RtlMoveMemory(S, A, Length(S) * 2);\n    // Trim BOM, if any\n    if (Length(S) >= 1) and (Ord(S[1]) = $FEFF) then\n      Delete(S, 1, 1);\n  end;\nend;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

也可以看看:

\n\n