zoukankan      html  css  js  c++  java
  • Delphi 判断文本文件的编码格式

    这里指的文本是用于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;
  • 相关阅读:
    html-fieldset线中嵌套字符
    在Windows平台上绿色安装postgresQL
    tomcat处理中文文件名的访问(乱码)
    CSS div水平垂直居中和div置于底部
    java-工具类-读取配置文件
    Win+Ctrl键设置
    eclipse-将同一个文件分屏显示
    spring-poi-excle往单元格写入图片
    spring-初始化完成后运行指定内容
    java-collections.sort异常Comparison method violates its general contract!
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2471247.html
Copyright © 2011-2022 走看看