在Inno Setup中读取Ansi和Unicode编码的文件

5

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

test.txt文件包含以下内容:

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

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

我的问题是,test.txt 之前是一个 ANSI 编码的文件。现在它可以是 ANSI 编码的文件或 Unicode 编码的文件。下面的函数对于 ANSI 编码的文件工作得很好,但如果文件编码为 UNICODE,则会出现问题。我怀疑与 LoadStringsFromFile 函数有关。因为当我调试时,我可以看到它返回的是 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;
1个回答

5

首先,注意Unicode不是一种编码方式,而是一种字符集。编码方式包括 UTF-8, UTF-16, UTF-32 等等。因此我们不知道您实际使用的编码方式。


在Inno Setup的Unicode版本中,LoadStringsFromFile函数(注意是复数形式,不要与单数LoadStringFromFile混淆)默认使用当前Windows Ansi编码。
但是,如果文件具有UTF-8 BOM,它将相应地处理内容。 BOM是一种常见的自动检测UTF-8(和其他UTF-*)编码的方式。您可以使用Windows记事本以UTF-8编码带BOM的方式创建文件。
UTF-16或其他编码不受原生支持。
要实现读取UTF-16文件,请参见在Inno Setup Pascal脚本中读取UTF-16文件

如果需要处理任何编码的文件,包括UTF-8无BOM格式的文件,请参考Inno Setup - 将字符串数组转换为Unicode再转换为ANSIInno Setup - 在UTF-8无BOM文件中替换字符串


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接