[英]Inno Setup Pascal Script - Reading UTF-16 file
我有一個從 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
函數加載它時:
procedure LoadResources;
var
RESOURCE_INFO: AnsiString;
begin
LoadStringFromFile(ExpandConstant('{tmp}\SKINRESOURCE - INFO.inf'), RESOURCE_INFO);
Log(String(RESOURCE_INFO));
end;
我在調試輸出中得到這個:
E
請告訴我如何解決這個問題。
提前致謝。
該文件采用 UTF-16 LE 編碼。
LoadStringFromFile
不支持任何 Unicode 編碼。 它將文件按原樣加載到字節數組( AnsiString
有效地用作字節數組)。
由於 Unicode string
(在Inno Setup 的 Unicode 版本中– Inno Setup 6 的唯一版本)實際上使用 UTF-16 LE 編碼,您需要做的就是將字節數組按位復制到 (Unicode) string
。 並修剪UTF-16 LE BOM ( FEFF
)。
procedure RtlMoveMemory(Dest: string; Source: PAnsiChar; Len: Integer);
external 'RtlMoveMemory@kernel32.dll stdcall';
function LoadStringFromUTF16LEFile(FileName: string; var S: string): Boolean;
var
A: AnsiString;
begin
Result := LoadStringFromFile(FileName, A);
if Result then
begin
SetLength(S, Length(A) div 2);
RtlMoveMemory(S, A, Length(S) * 2);
{ Trim BOM, if any }
if (Length(S) >= 1) and (Ord(S[1]) = $FEFF) then
Delete(S, 1, 1);
end;
end;
另見:
您嘗試記錄的文件似乎是 Windows Unicode (UTF-16LE) 編碼的文本文件。
您可以使用iConv命令行並將您的文件轉換為 Windows UTF-8 編碼文件。
LoadStringFromFile
支持函數不能很好地加載 Unicode 字符串,它只支持加載 ANSI 和 UTF-8 編碼文本文件。
Inno Setup Compiler Debug Output 停止記錄文本文件,因為它找到了一個它無法加載的字符(NULL),這就是為什么你在編譯器調試輸出中只得到“E”,即使LoadStringFromFile
完全加載了文本文件。
您需要下載 iConv 的安裝程序,如下所示,以獲得 iConv 可執行文件和一些用於在字符編碼之間轉換的 DLL。
下載后,安裝 GnuWin32 (LibIconv for Windows) 並進入安裝文件夾。
將以下四個文件復制到名為“bin”的安裝文件夾中的子目錄中。
他們是:
字符集1.dll
libiconv2.dll
圖標文件
libintl3.dll
將這些文件復制到您存儲 Inno 安裝項目文件的目錄中。
然后使用以下代碼進行轉換。
[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))
后記錄它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.