具有非ANSI文件的TStringList行为

具有非ANSI文件的TStringList行为,第1张

概述在我的应用程序中,当我想导入文件时,我使用TStringList. 但是,当有人从Excel导出数据时,文件编码是UCS-2 Little Endian,而TStringList无法读取数据. 有什么方法可以验证这种情况,识别文本编码并向用户发送提示文本不兼容的警告? 为了清楚起见,用户将只提供纯文本..通讯和数字,否则,我必须发送警告. 没有BOM的Unicode文件很好. (TStringLi 在我的应用程序中,当我想导入文件时,我使用TStringList.

但是,当有人从Excel导出数据时,文件编码是UCS-2 little Endian,而TStringList无法读取数据.

有什么方法可以验证这种情况,识别文本编码并向用户发送提示文本不兼容的警告?

为了清楚起见,用户将只提供纯文本..通讯和数字,否则,我必须发送警告.

没有BOM的Unicode文件很好. (TStringList可以读取它!)
ANSI文件也是. (TStringList可以读取它!)
如果有一种方法可以删除它,即使带有BOM的Unicode也会很好. (TStringList可以读取它!,但是带有“i”“>>”和“reverse?”字符,属于BOM字节)

解决方法 我在Delphi 6中使用以下函数来检测Unicode BOM.

const  //standard byte order marks (BOMs)  UTF8BOM:              array [0..2] of AnsiChar = #$EF#$BB#$BF;  UTF16littleEndianBOM: array [0..1] of AnsiChar = #$FF#$FE;  UTF16BigEndianBOM:    array [0..1] of AnsiChar = #$FE#$FF;  UTF32littleEndianBOM: array [0..3] of AnsiChar = #$FF#$FE#IsTextUnicode#;  UTF32BigEndianBOM:    array [0..3] of AnsiChar = ###$FE#$FF;function fileHasUnicodeBOM(const filename: string): Boolean;var  Buffer: array [0..3] of AnsiChar;  Stream: TfileStream;begin  Stream := TfileStream.Create(filename,fmOpenRead or fmShareDenyWrite); // Allow other programs read access at the same time.  Try    FillChar(Buffer,SizeOf(Buffer),$AA);//fill with characters that we are not expecting then...    Stream.Read(Buffer,SizeOf(Buffer));  //...read up to SizeOf(Buffer) bytes - there may not be enough    //use Read rather than ReadBuffer so the no exception is raised if we can't fill Buffer  Finally    FreeAndNil(Stream);  End;  Result := CompareMem(@UTF8BOM,@Buffer,SizeOf(UTF8BOM))              or            CompareMem(@UTF16littleEndianBOM,SizeOf(UTF16littleEndianBOM)) or            CompareMem(@UTF16BigEndianBOM,SizeOf(UTF16BigEndianBOM))    or            CompareMem(@UTF32littleEndianBOM,SizeOf(UTF32littleEndianBOM)) or            CompareMem(@UTF32BigEndianBOM,SizeOf(UTF32BigEndianBOM));end;

这将检测所有标准BOM.如果这是您想要的行为,您可以使用它来阻止此类文件.

您声明Delphi 6 TStringList如果没有BOM,则可以加载16位编码文件.虽然情况可能如此,但您会发现,对于ASCII范围内的字符,每个其他字符都是#0.我想这不是你想要的.

如果要检测文本是否为没有BOM的文件的Unicode,则可以使用.但是,它可能会产生误报.在这种情况下,我怀疑要求宽恕比获得许可更好.

现在,如果我是你,我实际上不会试图阻止Unicode文件.我会读他们的.使用TNT Unicode库.您想要的类称为TWIDeStringList.

总结

以上是内存溢出为你收集整理的具有非ANSI文件的TStringList行为全部内容,希望文章能够帮你解决具有非ANSI文件的TStringList行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1248777.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存