具有非ANSI文件的TStringList行为
在我的应用程序中,当我想导入文件时,我使用TStringList.
但是,当有人从Excel导出数据时,文件编码是UCS-2 Little Endian,而TStringList无法读取数据. 有什么方法可以验证这种情况,识别文本编码并向用户发送提示文本不兼容的警告? 为了清楚起见,用户将只提供纯文本..通讯和数字,否则,我必须发送警告. 没有BOM的Unicode文件很好. (TStringList可以读取它!) 解决方法
我在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#$00#$00; UTF32BigEndianBOM: array [0..3] of AnsiChar = #$00#$00#$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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |