EPr*_*und 4 delphi encoding file tstringlist delphi-6
在我的应用程序中,当我想导入文件时,我使用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#$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, @Buffer, SizeOf(UTF16LittleEndianBOM)) or
CompareMem(@UTF16BigEndianBOM, @Buffer, SizeOf(UTF16BigEndianBOM)) or
CompareMem(@UTF32LittleEndianBOM, @Buffer, SizeOf(UTF32LittleEndianBOM)) or
CompareMem(@UTF32BigEndianBOM, @Buffer, SizeOf(UTF32BigEndianBOM));
end;
Run Code Online (Sandbox Code Playgroud)
这将检测所有标准BOM.如果这是您想要的行为,您可以使用它来阻止此类文件.
您声明如果Delphi 6 TStringList没有BOM,则可以加载16位编码文件.虽然情况可能如此,但您会发现,对于ASCII范围内的字符,每个其他字符都是#0.我想这不是你想要的.
如果要检测该文本是否为没有BOM的文件的Unicode,则可以使用IsTextUnicode.但是,它可能会产生误报.在这种情况下,我怀疑要求宽恕比获得许可更好.
现在,如果我是你,我实际上不会试图阻止Unicode文件.我会读他们的.使用TNT Unicode库.你想要的课程被称为TWideStringList.
| 归档时间: |
|
| 查看次数: |
1068 次 |
| 最近记录: |