0

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

3 回答 3

4

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

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

于 2012-12-13T17:01:28.023 回答
3

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

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

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

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

于 2012-12-13T17:17:04.813 回答
0

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

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

于 2012-12-14T01:04:29.643 回答