使用delphi 2010将文本文件作为字节(逐字节)读取

时间:2012-12-13 16:54:15

标签: delphi delphi-2010

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

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

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

我不想使用标准的delphi IO操作

AssignFile
ReSet
ReWrite(OutFile);
ReadLn
WriteLn
CloseFile

有更好的方法吗?可以使用TStream(Reader& Writer)吗?

以下是我正在使用的示例测试。我知道从第84列开始有一个字符(350)(两个字节)。当在十六进制编辑器中查看时,该字符由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;

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

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

运行时库带有各种功能,可以在不同的文本编码之间进行转换。当然你不想尝试自己复制这个功能吗?

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

答案 2 :(得分:0)

5个小时后,您在另一个主题中提出了同样的问题,答案更能解决您的具体问题:

Replacing a unicode character in UTF-8 file using delphi 2010