【delphi】判断文件的编码方式(ANSI、Unicode、UTF8、UnicodeBIG)
在开发中,经常会碰到文件编码格式不正确,有时也需要进行编码转换,具体的编码原理可以自行查找,这里记录下我的处理方式。根据这个原理稍加修改即可实现编码转换和自动判断。
{判断文件的编码方式,可以实现编码转化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)相关推荐
- 字符编码简介 ANSI Unicode Unicode big endian UTF-8
1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和 1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte) ...
- 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式
统计"3_人民日报语料"文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式; 首先,统计文件的字符数,有两种方法.第一种是将文件复制到w ...
- Delphi判断文件是否正在被使用
Delphi判断文件是否正在被使用 2010-07-06 19:48 首先,我们先来认识下CreateFile函数,它的原型如下 HANDLE CreateFile( LPCTSTR lpFileNa ...
- python3文件的编码类型是什么_python3.x - 怎么查看某个文件的编码方式?python
问 题 python的确很赞,但是编码这个问题真的太尿性了... 现在我有一个文件,不论他的编码方式是什么,我都想把它转化成utf-8的格式.我的想法是先读取文件内容,保存到data变量中去,然后再以 ...
- 1个英文字母、1个汉字、标点符号各占几个字节?以及文件的编码方式查看
不同编码方式,占用的字节是不同的: 1,ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字度节的空间. 2,UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于 ...
- BT源代码学习心得(三):种子文件的编码方式 -- 转贴自wolfenstein (NeverSayNever)
BT源代码学习心得(三):种子文件的编码方式 author: wolfenstein BT的作者使用了一种比较简单易懂的编码方式来对设计种子文件.这种编码方式能够很简单得对python中的各种数据类型 ...
- vs文件乱码:文件加载,使用Unicode(UTF-8)编码加载文件xxx时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。解决方案
方案1:检查控制面板--时钟和区域中,标号3是否勾选,若勾选则取消. 方案2:在vs中,选择"工具"->"选项"->"文本编辑器" ...
- 字符串处理 - ANSI - Unicode - UTF8 转换
字符串处理 - ANSI - Unicode - UTF8 转换 [C语言]字符串处理 - ANSI - Unicode - UTF8 转换 2008-11-4: 使用MultiByteToWideC ...
- 字符编码 ansi unicode utf-8 区别
简介 为使计算机支持更多语言,通常使用 0x80~0xFFFF 范围的 2 个 字节来表示 1 个字符.比如:汉字 '中' 在 ANSI编码 中文操作系统中,使用 [0xD6,0xD0] 这两个字节存 ...
最新文章
- c语言多线程的作用是什么意思,多线程-如何在普通C语言中启动线程?
- 新兴AI解决方案将越来越依赖于嵌入式视觉技术
- 直接拿来用!最火的Android开源项目(一)
- 12小时紧急策划 复盘一篇10W+的诞生全历程
- 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
- Deep Learning学习 之 CNN代码解析(MATLAB)
- 2017-7-18-每日博客-关于Linux下的鲜为人知的10条命令.doc
- python学习-元组的复习及进阶使用(iterable、indexing and slicing、sequence unpacking、immutable、named tuple)
- TextView图文混排
- PHP Checkbox获取选中项与
- 目标检测(二十)--Mask R-CNN
- c语言社交网络,【C++】设计并实现一种简单的社交网络模型图
- 分享舍得网开发经验(修改版)(转载)
- 数据治理之数据质量管控流程(参考)
- 推荐几个前端 模板 框架,收藏
- field ii:一些查看技巧
- 【C语言训练】自由落体问题
- React自定义组件使用onClick传参注意:onClick只是一个名字而已!
- ucenter mysql账号_利用apache+php+mysql安装ucenter
- 从NLP视角看电视剧《狂飙》,会有什么发现?
热门文章
- [230516] TPO71 | 2022年托福阅读真题第4/36篇 | Electrical Energy from the Ocean | 11:50
- 10 分钟理解 BFC 原理
- 【重识云原生】第四章云网络4.8.2.2节——OpenFlow协议详解
- 调LCD屏LTV350QV的心得:
- Pycharm的External Documentation设置
- color demura原理_demura
- 布比李军:从难以接受到All In,我走过了一条怎样的路
- 如何用好广发样样行?
- uniCloud - 云数据库
- Unix传奇 (下篇)