Inno Setup 以 Ansi 和 Unicode 编码读取文件

Inno Setup Reading file in Ansi and Unicode encoding

我有一个名为 GetServerName 的函数。我需要传递文件名(例如 'test.txt')以及所需的部分字符串(例如 'server')

test.txt 文件包含类似这样的内容

data1 | abcd
data2 | efgh
server| 'serverName1'
data3 | ijkl

我需要提取服务器名称,所以在我的函数中我将传递类似 GetServerName('test.txt', 'server') 的内容,它应该 return serverName1.

我的问题是 test.txt 之前是一个 ANSI-encoded 文件。现在它可以是 ANSI-encoded 文件或 Unicode-encoded 文件。下面的函数对 ANSI-encoded 文件工作正常,但如果文件以 UNICODE 编码,则会出现问题。我怀疑有 LoadStringsFromFile 函数。因为当我调试时,我可以看到它 returns Unicode 字符而不是人类可读的字符。如何简单地解决我的问题? (或者如何找到我的文件的编码类型以及如何将UNICODE字符串转换为ANSI进行比较,然后我自己做)

function GetServerName(const FileName, Section: string): string;
//Get Smartlink server name
var
  DirLine: Integer;
  LineCount: Integer;
  SectionLine: Integer;   
  Lines: TArrayOfString;
  //Lines: String;
  AHA: TArrayOfString;
begin
  Result := '';
  if LoadStringsFromFile(FileName, Lines) then
  begin
    LineCount := GetArrayLength(Lines);
    for SectionLine := 0 to LineCount - 1 do
    begin
      AHA := StrSplit(Trim(Lines[SectionLine]), '|')
      if AHA[0] = Section then
      begin
       Result := AHA[1];
       Exit;
      end
    end
  end;
end;

编辑

在Windows中,当我另存为文本文件时。我在图片中附上了 4 个选项。我找到了,Windows 提到 unicode 作为 UTF-16LE 编码(有点混乱)

首先,请注意,Unicode 不是一种编码。 Unicode 是一个字符集。编码是UTF-8, UTF-16, UTF-32等等。所以我们不知道你实际使用的是哪种编码。


在 Inno Setup 的 Unicode 版本中,LoadStringsFromFile function 默认使用当前的 Windows Ansi 编码。

但是,如果文件有 UTF-8 BOM,它会相应地处理内容。 BOM 是自动检测 UTF-8(和其他 UTF-*)编码的常用方法。您可以使用 Windows 记事本创建包含 BOM 的 UTF-8 编码文件。

本机不支持 UTF-16 或其他编码。

读取UTF-16文件的实现见

要处理任何编码的文件,包括不带 BOM 的 UTF-8,请参阅 or