我想逐字节读取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;
答案 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