gpt4 book ai didi

file - 非 ANSI 文件的 TStringList 行为

转载 作者:行者123 更新时间:2023-12-03 15:09:14 26 4
gpt4 key购买 nike

在我的应用程序中,当我想要导入文件时,我使用 TStringList。

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

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

需要明确的是,用户将仅提供纯文本..字母和数字,否则我必须发送警告。

没有 BOM 的 Unicode 文件很好。 (TStringList可以读取!)
ANSI 文件也是如此。 (TStringList可以读取!)
如果有办法删除它,即使带有 BOM 的 Unicode 也会很好。 (TStringList可以读取它!但是带有“i”“>>”和“反向?”字符,属于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;

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

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

如果您想检测没有 BOM 的文件的文本是否为 Unicode,那么您可以使用 IsTextUnicode 。然而,它可能会给出误报。在这种情况下,我怀疑请求原谅比获得许可更好。

现在,如果我是你,我实际上不会尝试阻止 Unicode 文件。我会读它们。使用 TNT Unicode 库。您想要的类名为 TWideStringList

关于file - 非 ANSI 文件的 TStringList 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16240354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com