如何判断文本文件的编码格式?

原创 2006年06月05日 23:07:00
这里指的文本是用于Windows系统中的扩展名为.txt的文件。

Notepad(记事本)只支持四种格式:ANSI/Unicode/Unicode big endian/UFT-8,在Delphi中如何判断与读取这些不同格式的文本呢?

首先,不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下:

ANSI:        无格式定义;
Unicode:       前两个字节为FFFE;
Unicode big endian: 前两字节为FEFF; 
UTF-8:        前两字节为EFBB; 

知道了各种编码格式的区别,写代码就容易了,以下是我在一个软件中写的处理代码:
(注意,Delphi的TMemo/TRichEdit只支持ANSI的文本文件,其它编码格式的文件需要
自行写代码转换成GB2312或BIG5,方能正确显示)

type
  TTextFormat=(tfAnsi,tfUnicode,tfUnicodeBigEndian,tfUtf8);
const
  TextFormatFlag:array[tfAnsi..tfUtf8] of word=($0000,$FFFE,$FEFF,$EFBB); 

function WordLoHiExchange(w:Word):Word;register;
asm
  XCHG AL, AH
end;

{ TextFormat返回文本编码类型,sText未经处理的文本 }
procedure ReadTextFile(const FileName: string;
  var TextFormat: TTextFormat; var sText:string);
var
  w:Word;
  b:Byte;
begin
  with TFileStream.Create(FileName,fmOpenRead or fmShareDenyNone) do
  try
    Read(w,2);
    w:=WordLoHiExchange(w);//因为是以Word数据类型读取,故高低字节互换
    if w = TextFormatFlag[tfUnicode] then
      TextFormat:= tfUnicode
    else if w = TextFormatFlag[tfUnicodeBigEndian] then
      TextFormat:= tfUnicodeBigEndian
    else if w = TextFormatFlag[tfUtf8] then
    begin
      Read(b,1);//这里要注意一下,UFT-8必须要跳过三个字节。
      TextFormat:=tfUtf8;
    end else
    begin
      TextFormat:=tfANSI;
      Position:=0;
    end;
    SetLength(sText,Size-Position);
    ReadBuffer(sText[1],Size-Position);
  finally
    Free;
  end;
end;

验证码之中文验证码

【课程介绍】 技术选型 技术: Springmvc4+Mybatis3+Spring4+JDK1.8+Css+Jsp IDE开发工具: Eclipse Neon.3 课程内容:中文验证码 【验证码】 验证码可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。
  • 2017年10月20日 10:42

如何判断一个文件的编码格式是gb2312还是gbk等

GB2312-80编码的编码范围是高位0xa1-0xfe,低位是 0xa1-0xfe ,其中汉字范围为 0xb0a1 和 0xf7fe,如果只是简单地判断汉字,则只要查看高字节是否大于等于0xa1就可...
  • aerchi
  • aerchi
  • 2015-08-18 12:10:54
  • 5792

Delphi判断文本文件的编码格式

今天在网上看到一位老兄写的判断记事本保存的文本的四种格式的判断,觉得非常不错。Notepad(记事本)只支持四种格式:ANSI/Unicode/Unicode big endian/UFT-8,在De...
  • redeastfan
  • redeastfan
  • 2010-03-22 23:17:00
  • 3101

delphi获取文件编码

//delphi获取文件编码 unit EncodeUnit; interface uses SysUtils, Windows, Classes; type TTextFormat...
  • wozengcong
  • wozengcong
  • 2016-03-10 13:30:12
  • 729

DelphiXE Ansi字符串UTF-8编码判断

DelphiXE下Ansi字符串UTF-8编码判断[转载]
  • q907676951
  • q907676951
  • 2017-03-09 16:43:08
  • 66

判断文本文件是否UTF-8编码

utf-8编码的文本文档,有的带有BOM (Byte Order Mark, 字节序标志),即0xEF, 0xBB,0xBF,有的没有。...
  • zb361419953
  • zb361419953
  • 2017-01-13 14:45:23
  • 2101

Delphi 判断文本文件的编码格式

不同编码的文本,是根据文本的前两个字节来定义其编码格式的。定义如下: ANSI: 无格式定义; Unicode: 前两个字节为FFFE; Unicode big endian: 前两字节为FEF...
  • bluewind23
  • bluewind23
  • 2012-07-10 23:13:12
  • 504

怎么看一个文本文件的编码

打开记事本,菜单“文件”-“打开”,找到目标文件,选中,这时下面的编码中显示的就是这个文件的编码,ANSI, Unicode, Unicode big endian, UTF-8。Quixote对un...
  • celavi
  • celavi
  • 2007-08-23 00:13:00
  • 21656

java判断文件是否正在写入

Flink批处理时,遇到一个场景:flink在分析日志文件时,如果日志文件已经存在,flink则会正确读取并分析日志文件。这里问什么说正确读取呢?假设,日志文件很大,大到100M,在慢网络情况下,将日...
  • qq_21682469
  • qq_21682469
  • 2017-12-15 00:00:50
  • 1049

判断一个字符串有没有内容

public void searchBook(String name,String author,String publisher)throws SQLException{ try { Conn...
  • qq_29797077
  • qq_29797077
  • 2017-06-10 17:16:04
  • 182
收藏助手
不良信息举报
您举报文章:如何判断文本文件的编码格式?
举报原因:
原因补充:

(最多只允许输入30个字)