Delphi的Encoding.GetString方法不返回字符串,为何如此设计?

2026-04-10 02:291阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计591个文字,预计阅读时间需要3分钟。

Delphi的Encoding.GetString方法不返回字符串,为何如此设计?

在使用Delphi 2009时,以下代码段适用于各种情况,但存在一些格式问题。以下是修改后的版本,不超过100个字:

pascalvar BOMLength: integer; Buffer: TBytes; Encoding: TEncoding; Value: string;SetLength(Buffer, 2048);CurFileStream.Read(Buffer[0], 2048);Encoding :=nil;BOMLength;

我正在使用Delphi 2009.

这在所有情况下都适用于我,但有一个:

Delphi的Encoding.GetString方法不返回字符串,为何如此设计?

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函数无法返回值的原因.但是当它知道何时停止时,它没关系.

如果源字节为空,或者如果它无法解码字节,则GetString()返回空字符串(而不是引发异常).在您的情况下,您没有告诉GetString()忽略BOM或缓冲区的未填充部分.此外,请确保编码最初为零.

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;

如果仍然不起作用,则源数据很可能在其中包含非法字节.

本文共计591个文字,预计阅读时间需要3分钟。

Delphi的Encoding.GetString方法不返回字符串,为何如此设计?

在使用Delphi 2009时,以下代码段适用于各种情况,但存在一些格式问题。以下是修改后的版本,不超过100个字:

pascalvar BOMLength: integer; Buffer: TBytes; Encoding: TEncoding; Value: string;SetLength(Buffer, 2048);CurFileStream.Read(Buffer[0], 2048);Encoding :=nil;BOMLength;

我正在使用Delphi 2009.

这在所有情况下都适用于我,但有一个:

Delphi的Encoding.GetString方法不返回字符串,为何如此设计?

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函数无法返回值的原因.但是当它知道何时停止时,它没关系.

如果源字节为空,或者如果它无法解码字节,则GetString()返回空字符串(而不是引发异常).在您的情况下,您没有告诉GetString()忽略BOM或缓冲区的未填充部分.此外,请确保编码最初为零.

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;

如果仍然不起作用,则源数据很可能在其中包含非法字节.