No'*_*man 8 delphi utf-8 delphi-7
我在Delphi(7)中编写了一个应用程序(心理测试考试),它创建了一个标准的文本文件 - 即该文件的类型为ANSI.
有人将程序移植到Internet上运行,可能使用Java,生成的文本文件类型为UTF-8.
读取这些结果文件的程序必须读取Delphi创建的文件和通过Internet创建的文件.
虽然我可以将UTF-8文本转换为ANSI(使用狡猾命名的函数UTF8ToANSI),但我怎么能提前告诉我有哪种文件?
看到我'拥有'文件格式,我想最简单的处理方法是在文件中放置一个已知位置的标记,这将告诉我程序的来源(Delphi/Internet),但这似乎作弊.
提前致谢.
Mor*_*gil 18
没有100%可靠的方法来识别UTF-8编码的ANSI(例如Windows-1250)编码.这里是其中ANSI文件不能是有效的UTF-8,但每一个有效的UTF-8的文件很可能会成为一个不同的ANSI文件.(不用提纯ASCII数据,这些数据是既由定义ANSI和UTF-8,但这纯粹是一个理论方面).
例如,序列C4 8D可能是UTF-8中的"č"字符,或者在windows-1250中可能是"ŤŤ".两者都是可能和正确的.但是,例如8D 9A在windows-1250中可以是"Ťš",但它不是有效的UTF-8字符串.
你必须采用某种启发式方法,例如
另请参阅记事本使用的方法.
如果 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;
Run Code Online (Sandbox Code Playgroud)
否则,难度就大得多。