簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM