使用 delphi 2010 以字节(逐字节)的形式读取文本文件



我想逐个字节读取 UTF-8 文本文件,并获取文件中每个字节的 ascii 值表示形式。这能做到吗?如果是这样,最好的方法是什么?

的目标是用一个字节替换我找到的 2 个字节组合(这些是我准备好的设置条件)

例如,如果我找到一个 197 后跟一个 158(十进制表示),我将用一个字节 17 替换它

我不想使用标准的德尔福 IO 操作

AssignFile
ReSet
ReWrite(OutFile);
ReadLn
WriteLn
CloseFile

有没有更好的方法?这可以使用TStream(阅读器和写入器)来完成吗?

这是我正在使用的示例测试。我知道有一个字符(350)(两个字节)从第 84 列开始。在十六进制编辑器中查看时,该字符由 197 + 158 组成 - 所以我试图使用我的 delphi 代码找到 198,但似乎找不到它

FS1:= TFileStream.Create(ParamStr1, fmOpenRead);
try
 FS1.Seek(0, soBeginning);
 FS1.Position:= FS1.Position + 84;
 FS1.Read(B, SizeOf(B));
 if ord(B) = 197 then showMessage('True') else ShowMessage('False');
finally
 FS1.Free;
end;

您可以使用 TFileStream 将所有数据从文件读取到字节数组,稍后检查 utf8 序列。另请注意,utf8 序列可以包含 2 个以上的字节。

而且,在Delphi中有一个函数Utf8ToUnicode,它将utf8数据转换为可用的Unicode字符串。

我的理解是您想将文本文件从 UTF-8 转换为 ASCII。这很简单:

StringList.LoadFromFile(UTF8FileName, TEncoding.UTF8);
StringList.SaveToFile(ASCIIFileName, TEncoding.ASCII);

运行时库具有各种功能,可以在不同的文本编码之间进行转换。您肯定不想尝试自己复制此功能吗?

我相信您意识到这种转换可能会丢失数据。序数大于 127 的字符不能用 ASCII 表示。事实上,每个需要超过 1 个八位字节的 UTF-8 码位点都不能用 ASCII 表示。

5 小时后,您在另一个主题中提出了相同的问题,该答案更好地解决了您的特定问题:

使用 delphi 2010 替换 UTF-8 文件中的 unicode 字符