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;