我正在使用TStreamReader从声称为utf-8的文件中读取数据。我没有问题阅读文件,直到它包含一个包含我看来是UTF-8“£”符号的部分,前面的xC2缺失 - 该文件只包含角色的xA3部分。我通过运行时库跟踪了这个,直到它调用
Result := UnicodeFromLocaleChars(FCodePage, FMBToWCharFlags,
PAnsiChar(Bytes), ByteCount, nil, 0);
返回0表示它不喜欢输入。不幸的是,TStreamReader最终会丢弃此输入缓冲区,然后继续使用文件的其余部分而不会引发错误。这对于问题只是一个侧面问题极其误导。
问题似乎是UTF-8 TEncoding类中的“缺陷”,因为它只是丢弃转换失败的结果,而TStreamReader假定这不是TEncoding的行为。
我可以使用
来解决这个问题Reader := TStreamReader.Create(FileStream, TMBCSEncoding.Create(CP_UTF8, 0, 0));
而不是
Reader := TStreamReader.Create(FileStream, TEncoding.UTF8);
因为这使得它忽略了损坏的UTF-8并且只是在我的输出中包含一些东西(我没有检查过什么)。但是,我想结合允许数据通过报告它,并且似乎没有任何明显的方法来执行此操作,因为行为隐藏在库的深处。
有没有人知道任何标准的Delphi库工具,或者我是否需要使用大量的自定义代码?