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)
请告诉我如何解决这个问题。
提前致谢。
该文件采用 UTF-16 LE 编码。
\n不LoadStringFromFile
支持任何 Unicode 编码。它将文件按原样加载到字节数组(实际上AnsiString
用作字节数组)。
由于 Unicode string
(Inno Setup \xe2\x80\x93 的 Unicode 版本是 Inno Setup 6 中唯一的版本)实际上使用 UTF-16 LE 编码,因此您需要做的就是将字节数组按位复制到 (Unicode )string
。并修剪UTF-16 LE BOM ( FEFF
)。
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 归档时间: |
|
查看次数: |
2121 次 |
最近记录: |