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 。
我有一个名为 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,请参阅