我想逐个字节读取 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 字符