在开发中,经常会碰到文件编码格式不正确,有时也需要进行编码转换,具体的编码原理可以自行查找,这里记录下我的处理方式。根据这个原理稍加修改即可实现编码转换和自动判断。

{判断文件的编码方式,可以实现编码转化sensor2018-08-02
}
unit uCODE_Convert;interface
usesWinapi.Windows,System.SysUtils,System.Variants,System.Classes;typeTCODE_TYPE = (ctANSI,ctUnicode,ctUTF8,ctUnicodeBIG);//判断一个文件的编码格式
//入口参数:FieName文件名称
//出口参数:文件类型
function Get_FileCode_TYPE(FileName : string) : TCODE_TYPE;//判断一个文件是不是ANSI编码,判断标准是 大于$80的字节必须偶数出现,
//内容中不能出现$00 否则肯定不是,如果全部是,则表示是ANSI编码
//入口:文件字节流
//出口:True 表示时ANSI编码,否则不是ANSI编码
function is_ANSI_CODE(M : TMemoryStream) : Boolean;//判断是否是UTF8
function is_UTF8_CODE(BB : TBytes) : Boolean;function GetEncodingType(code: TCODE_TYPE): Tencoding;function GetFileEncoding(FileName : string) : Tencoding;implementationfunction GetFileEncoding(FileName : string) : Tencoding;
varcode: TCODE_TYPE;
begincode := Get_FileCode_TYPE(FileName);result := GetEncodingType(code);
end;function GetEncodingType(code: TCODE_TYPE): Tencoding;
begincase code ofctANSI:result := TEncoding.ANSI;ctUnicode:result := TEncoding.Unicode;ctUTF8:result := TEncoding.UTF8;ctUnicodeBIG:result := TEncoding.BigEndianUnicodeelseresult := TEncoding.ANSI;end;
end;//判断一个文件的编码格式
function Get_FileCode_TYPE(FileName : string) : TCODE_TYPE;
varMF : TMemoryStream;MB : TBytes;B  : Byte;Position,Len,i : Int64;D80 : Int64;isANSI : Boolean;
begin//首先打开文件if not FileExists(FileName) then Exit(ctANSI);MF := TMemoryStream.Create;MF.LoadFromFile(FileName);MF.Position := 0;Len := MF.Size;SetLength(MB,Len);MF.Read(MB[0],Len);       //读取数据到内存表中MF.Free;try//1. 首先根据标志判断 FF FE?if (MB[0] = $FF) and (MB[1] = $FE) then Exit(ctUnicode);   //Unicode//2. 首先根据标志判断 FE FF?if (MB[0] = $FE) and (MB[1] = $FF) then Exit(ctUnicodeBIG);   //ctUnicodeBIG//3. 首先根据标志判断 EF BB BF?if (MB[0] = $EF) and (MB[1] = $BB) and (MB[2] = $BF) then Exit(ctUTF8);   //ctUTF8//下面判断是否是UTF8if is_UTF8_CODE(MB) then exit(ctUTF8);//下面判断是否是ANSI ,同时又确认UnicodeisANSI := True;for i := 0 to Len - 1 dobeginB := MB[i];if B = 0 thenif (Len Mod 2) = 0 then  //说明是Unicode ,此时需要判断是不是 Bigbeginif i = 0 then Exit(ctUnicodeBIG);   //第一个就是0,并且是偶数字节,可以确定是ctUnicodeBIGif MB[i - 1] < $80 thenExit(ctUnicode)             //第一个$00的前面是小于$80,说明是Unicode, 否则是UnicodeBigelseExit(ctUnicodeBIG)endelsebeginisANSI := False;Break;   //出现0字符,长度又不是偶数字节,可以确定表示不是ANSIend;end;if isANSI then Exit(ctANSI);finally// MF.Free;end;end;function is_ANSI_CODE(M : TMemoryStream) : Boolean;
varMB : TBytes;B : Byte;Position,Len,i : Int64;D80 : Int64;
beginResult := False;Len := M.Size;       //文件长度M.Position := 0;     //从第一个开始D80 := 0;              //默认$80数SetLength(MB,Len);M.Read(MB[0],Len);     //读取到内存中for i := 0 to Len - 1 dobeginB := MB[i];if B = 0 then Exit(False);  //出现0字符,表示不是ANSIif B >= $80 thenD80 := D80 + 1elseif (D80 mod 2) = 0 thenD80 := 0elseExit(False);end;Result := True;
end;//判断是否是UTF8
function is_UTF8_CODE(BB : TBytes) : Boolean;
varB : Byte;Position,Len,i : Int64;D80 : Int64;
beginResult := True;Len := Length(BB);i := 0;while (i < Len - 1) dobeginB := BB[i];if B < $80 thenbegini := i + 1;Continue;end;if B < $C0 then  // (11000000): 值介于0x80与0xC0之间的为无效UTF-8字符beginExit(False);end;if B < $E0 then  // (11100000): 此范围内为2字节UTF-8字符beginif i >= (Len - 1) then  Exit(False);if (BB[ i + 1 ] and $C0) <> $80 then Exit(False);i := i + 2;end;if B < $F0 then  // (11110000): 此范围内为3字节UTF-8字符beginif i >= (Len - 1 - 1) then  Exit(False);if ((BB[ i + 1 ] and $C0) <> $80) and ((BB[ i + 2 ] and $C0) <> $80) then Exit(False);i := i + 3;endelseExit(False);end;end;end.

【delphi】判断文件的编码方式(ANSI、Unicode、UTF8、UnicodeBIG)相关推荐

  1. 字符编码简介 ANSI Unicode Unicode big endian UTF-8

    1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和 1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte) ...

  2. 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式

    统计"3_人民日报语料"文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式; 首先,统计文件的字符数,有两种方法.第一种是将文件复制到w ...

  3. Delphi判断文件是否正在被使用

    Delphi判断文件是否正在被使用 2010-07-06 19:48 首先,我们先来认识下CreateFile函数,它的原型如下 HANDLE CreateFile( LPCTSTR lpFileNa ...

  4. python3文件的编码类型是什么_python3.x - 怎么查看某个文件的编码方式?python

    问 题 python的确很赞,但是编码这个问题真的太尿性了... 现在我有一个文件,不论他的编码方式是什么,我都想把它转化成utf-8的格式.我的想法是先读取文件内容,保存到data变量中去,然后再以 ...

  5. 1个英文字母、1个汉字、标点符号各占几个字节?以及文件的编码方式查看

    不同编码方式,占用的字节是不同的: 1,ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字度节的空间. 2,UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于 ...

  6. BT源代码学习心得(三):种子文件的编码方式 -- 转贴自wolfenstein (NeverSayNever)

    BT源代码学习心得(三):种子文件的编码方式 author: wolfenstein BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件.这种编码方式能够很简单得对python中的各种数据类型 ...

  7. vs文件乱码:文件加载,使用Unicode(UTF-8)编码加载文件xxx时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。解决方案

    方案1:检查控制面板--时钟和区域中,标号3是否勾选,若勾选则取消. 方案2:在vs中,选择"工具"->"选项"->"文本编辑器" ...

  8. 字符串处理 - ANSI - Unicode - UTF8 转换

    字符串处理 - ANSI - Unicode - UTF8 转换 [C语言]字符串处理 - ANSI - Unicode - UTF8 转换 2008-11-4: 使用MultiByteToWideC ...

  9. 字符编码 ansi unicode utf-8 区别

    简介 为使计算机支持更多语言,通常使用 0x80~0xFFFF 范围的 2 个 字节来表示 1 个字符.比如:汉字 '中' 在 ANSI编码 中文操作系统中,使用 [0xD6,0xD0] 这两个字节存 ...

最新文章

  1. c语言多线程的作用是什么意思,多线程-如何在普通C语言中启动线程?
  2. 新兴AI解决方案将越来越依赖于嵌入式视觉技术
  3. 直接拿来用!最火的Android开源项目(一)
  4. 12小时紧急策划 复盘一篇10W+的诞生全历程
  5. 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
  6. Deep Learning学习 之 CNN代码解析(MATLAB)
  7. 2017-7-18-每日博客-关于Linux下的鲜为人知的10条命令.doc
  8. python学习-元组的复习及进阶使用(iterable、indexing and slicing、sequence unpacking、immutable、named tuple)
  9. TextView图文混排
  10. PHP Checkbox获取选中项与
  11. 目标检测(二十)--Mask R-CNN
  12. c语言社交网络,【C++】设计并实现一种简单的社交网络模型图
  13. 分享舍得网开发经验(修改版)(转载)
  14. 数据治理之数据质量管控流程(参考)
  15. 推荐几个前端 模板 框架,收藏
  16. field ii:一些查看技巧
  17. 【C语言训练】自由落体问题
  18. React自定义组件使用onClick传参注意:onClick只是一个名字而已!
  19. ucenter mysql账号_利用apache+php+mysql安装ucenter
  20. 从NLP视角看电视剧《狂飙》,会有什么发现?

热门文章

  1. [230516] TPO71 | 2022年托福阅读真题第4/36篇 | Electrical Energy from the Ocean | 11:50
  2. 10 分钟理解 BFC 原理
  3. 【重识云原生】第四章云网络4.8.2.2节——OpenFlow协议详解
  4. 调LCD屏LTV350QV的心得:
  5. Pycharm的External Documentation设置
  6. color demura原理_demura
  7. 布比李军:从难以接受到All In,我走过了一条怎样的路
  8. 如何用好广发样样行?
  9. uniCloud - 云数据库
  10. Unix传奇 (下篇)