我正在使用Delphi 2009。
这在所有情况下都适用于我,但只有一个:
var
BOMLength: integer;
Buffer: TBytes;
Encoding: TEncoding;
Value: string;
SetLength(Buffer, 2048);
CurFileStream.Read(Buffer[0], 2048);
Encoding := nil;
BOMLength := TEncoding.GetBufferEncoding(Buffer, Encoding);
Value := Encoding.GetString(Buffer);
在一种情况下,它不起作用,该文件是一个简单的小文件,并以UTF8字节顺序标记(BOM)开始,即十六进制:'EF BB BF'并包含以下内容:
0 HEAD
0 @I1@ INDI
1 NAME Barthel Lee /Brenner/
2 CONT MAURICE F. WEAVER
2 CONT When I was eleven or twelve years old, I went to Camp Marguette for a w
2 CONC eek or two in the summertime. It was operated by Catholic Charities and w
0 TRLR
在调用CurFileStreamRead之后,当我检查Buffer的值时,它包含BOM后跟文件,0填充Buffer的2048个字符的其余部分。编码正确检测到UTF8 BOM并将BOMLength设置为3。
但是,在Encoding.GetString语句之后,Value的值是空字符串:''。
我在其周围放置了一个try-except块来尝试捕获任何异常,但没有。
该代码适用于500个不同类型的其他文件,但不适用于此文件。
有谁知道我可以做些什么来解决这个问题,以便正确读取文件?
或者文件可能有问题,但我不确定它有什么不同,或者如何识别可能有所不同或错误的内容。
跟进:
雷米的回答是正确的。我现在已经确定它只是小文件,小于缓冲区大小(在我的情况下为2048字节),如果不设置长度就无法工作。
正如我所指出的,缓冲区的剩余部分填充为零。这必然是导致Encoding.GetString函数无法返回值的原因。但是当它知道何时停止时,它没关系。
答案 0 :(得分:5)
GetString()
将返回空字符串(而不是引发异常)。在您的情况下,您没有告诉GetString()
忽略BOM或缓冲区的未填充部分。另外,请确保Encoding
最初为零。
var
BOMLength: integer;
Buffer: TBytes;
BufLength: Integer;
Encoding: TEncoding;
Value: string;
begin
SetLength(Buffer, 2048);
BufLength := CurFileStream.Read(Buffer[0], Length(Buffer));
Encoding := nil;
BOMLength := TEncoding.GetBufferEncoding(Buffer, Encoding);
Value := Encoding.GetString(Buffer, BOMLength, BufLength - BOMLength);
end;
如果仍然无效,则源数据很可能包含非法字节。