Windows文本文件支持4种编码格式ANSI、Unicode、Unicode big endian、UFT-8;在操作文本文件时必须以正确的编码格式打开,否则将会是乱码。
function WordLoHiExchange(w: word): word; register;
asm
XCHG AL, AH
end;
{
取得文件编码 返回值 TEncoding
Windows文本文件支持4种格式:ANSI、Unicode、Unicode big endian、UFT-8
ANSI: 无格式定义 $0000;
Unicode: 前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF;
UTF-8: 前两字节为EFBB;
}
function GetFileEncodeing(const Filename: string): TEncoding;
type
TTextFormat = (tfAnsi, tfUnicode, tfBigEndianUnicode, tfUtf8);
const
TextFormatFlag: array [tfAnsi .. tfUtf8] of word = ($0000, $FFFE, $FEFF, $EFBB);
var
w: word;
begin
with TFileStream.Create(Filename, fmOpenRead or fmShareDenyNone) do
begin
try
Seek(0, soFromBeginning);
Read(w, 2);
w := WordLoHiExchange(w); // 因为是以Word数据类型读取,故高低字节互换
if w = TextFormatFlag[tfUnicode] then
Result := TEncoding.Unicode
else if w = TextFormatFlag[tfBigEndianUnicode] then
Result := TEncoding.BigEndianUnicode
else if w = TextFormatFlag[tfUtf8] then
Result := TEncoding.UTF8
else
Result := TEncoding.ANSI;
finally
Free;
end;
end;
end;
// 调用
procedure TForm1.btn1Click(Sender: TObject);
var
Filename: string;
Encoding: TEncoding;
begin
Filename := 'test.txt';
Encoding := GetFileEncodeing(Filename);
mmo1.Text := TFile.ReadAllText(Filename, Encoding); // TFile 引用 System.IOUtils
end;




