德尔福东京 - 我有一个文本文件...(特别是CSV文件).我正在使用TextFile操作逐行读取文件...文件的前三个字节有一些我不感兴趣的标题数据.虽然我认为这将是所有文件中的情况,我想验证在我删除它之前.简而言之,我想读取该行,将前三个字节与三个十六进制值进行比较,如果匹配,则删除3个字节.
当我在十六进制编辑器中查看文件时,我明白了
EF BB BF ...
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,我的比较都不起作用.这是一个代码片段.
var
LeadingBadBytes: String;
begin
// Open file, and read first line into variable TriggerHeader
...
LeadingBadBytes := '$EFBBBF';
if AnsiPos(LeadingBadBytes, TriggerHeader) = 1 then
delete(TriggerHeader, 1, 3);
Run Code Online (Sandbox Code Playgroud)
DELETE命令本身工作正常,但我无法使AnsiPos工作.我应该做些什么呢?
字节EF BB BF是UTF-8 BOM,它将文件标识为以UTF-8编码的Unicode文本.它们只出现在文件的开头,而不是出现在每一行.
您的比较不起作用,因为您将读取的字符串与文字字符串 进行比较'$EFBBBF',而不是字节序列 EF BB BF.
改变这个:
LeadingBadBytes := '$EFBBBF';
...
Delete(TriggerHeader, 1, 3);
Run Code Online (Sandbox Code Playgroud)
对此:
LeadingBadBytes := #$FEFF; // EF BB BF is the UTF-8 encoded form of Unicode codepoint U+FEFF...
...
Delete(TriggerHeader, 1, 1); // or Delete(..., Length(LeadingBadBytes))
Run Code Online (Sandbox Code Playgroud)
另外,考虑使用StrUtils.StartsText(...)而不是AnsiPos(...) = 1.
话虽这么说,Delphi的现代版本应该为您处理BOM,您根本不应该在读取数据中接收它.但是,既然你说你正在使用a TextFile,它就不是BOM感知的,AFAIK.您不应该开始使用过时的 Pascal样式的文件I/O. 尝试使用更现代的Delphi RTL I/O类,比如TStringList或者TStreamReader,它们是BOM感知的.