我用Delphi(7)编写了一个应用程序(心理测试考试),该应用程序创建了一个标准文本文件-即该文件的类型为ANSI。
有人将程序移植到Internet上,可能使用Java来运行,并且结果文本文件的类型为UTF-8。
读取这些结果文件的程序将必须同时读取由Delphi创建的文件和通过Internet创建的文件。
虽然我可以将UTF-8文本转换为ANSI(使用狡猾的命名函数UTF8ToANSI),但我如何提前知道我拥有哪种文件?
[我以为我是文件格式的所有者,我想最简单的处理方法是在文件中的已知位置放置一个标记,该标记会告诉我程序的来源(Delphi / Internet),但是这似乎在作弊。
提前感谢。
如果UTF文件以UTF-8字节顺序标记(BOM)开头,这很容易:
function UTF8FileBOM(const FileName: string): boolean;
var
txt: file;
bytes: array[0..2] of byte;
amt: integer;
begin
FileMode := fmOpenRead;
AssignFile(txt, FileName);
Reset(txt, 1);
try
BlockRead(txt, bytes, 3, amt);
result := (amt=3) and (bytes[0] = $EF) and (bytes[1] = $BB) and (bytes[2] = $BF);
finally
CloseFile(txt);
end;
end;
否则,要困难得多。
没有100%确定的方法可以从UTF-8编码中识别ANSI(例如Windows-1250)编码。有are个ANSI文件,其中cannot是有效的UTF-8,但是every有效的UTF-8文件也可能是另一个ANSI文件。 (更不用说纯ASCII数据了,按照定义,它们都是both ANSI和UTF-8,但这纯粹是理论上的问题。)
例如,序列C4 8D在UTF-8中可能是“č”字符,在Windows-1250中可能是“ÄŤ”。两者都是可能且正确的。但是,例如在Windows-1250中8D 9A可以是“Ťš”,但它不是有效的UTF-8字符串。
[您必须诉诸某种启发式,例如
如果我们求助
//if is possible to decoded,then it is UTF8
function isFileUTF8(const Tex : AnsiString): boolean;
begin
result := (Tex <> '') and (UTF8Decode(Tex) <> '');
end;