C#获取文本文件的编码格式Encoding,自动区分GB2312和UTF8
C#获取文本文件的编码格式Encoding,自动区分GB2312和UTF8
C# Code: /// <summary> /// C#获取文本文件的编码,自动区分GB2312和UTF8 /// </summary> public static class FileEncoding { /// <summary> /// C#根据字节数据byte[]前2位判断文本文件的Encoding编码格式 /// </summary> /// <param name="bs"></param> /// <returns></returns> public static System.Text.Encoding GetType(byte[] bs) { Encoding result = System.Text.Encoding.Default; using (System.IO.MemoryStream fs = new MemoryStream(bs)) { using (System.IO.BinaryReader br = new System.IO.BinaryReader(fs)) { Byte[] buffer = br.ReadBytes(2); if (buffer[0] >= 0xEF) { if (buffer[0] == 0xEF && buffer[1] == 0xBB) { result = System.Text.Encoding.UTF8; } else if (buffer[0] == 0xFE && buffer[1] == 0xFF) { result = System.Text.Encoding.BigEndianUnicode; } else if (buffer[0] == 0xFF && buffer[1] == 0xFE) { result = System.Text.Encoding.Unicode; } else { result = System.Text.Encoding.Default; } } else { result = System.Text.Encoding.Default; } br.Close(); br.Dispose(); fs.Close(); fs.Dispose(); } } return result; } /// <summary> /// 获取文件编码格式 /// </summary> /// <param name="file"></param> /// <returns></returns> public static System.Text.Encoding GetType(string file) { using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM Encoding reVal = Encoding.Default; using (BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default)) { int.TryParse(fs.Length.ToString(), out int i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = Encoding.Unicode; } r.Close(); } fs.Close(); fs.Dispose(); return reVal; } } /// <summary> /// 判断是否是不带 BOM 的 UTF8 格式 /// </summary> /// <param name=“data“></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data) { int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判断当前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //若是UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("非预期的byte格式"); } return true; } } //来源:C/S框架网 | www.csframework.com | QQ:23404761 扫一扫加微信
参考文档:
C# 自动生成Goolge/Baidu的SiteMap.xml文件 C# 通过文件扩展名获取图标和描述 C# 使用List C#控制台窗体(Console Window)内容输出到文本文件 C# Mini版本文件浏览器.TreeView/ListView应用 C#获取系统嵌入式资源,如Xml,Txt文件 C# 从注册表获取Windows服务的文件路径 C# 几个常用获取当前文件名的方法 C#窗体乱码将文件格式ANSI改为UTF-8 C#获取当前程序集Assembly的文件名 C#获取应用程序当前文件目录位置(安装路径) 通用文本提示对话框窗体支持保存文本文件|C/S框架网 C#使用StreamWriter在大文本文件末尾添加一行内容 C#获取文件的编码格式(UTF-8/UNICODE/ASCII) C#根据字节数据byte[]前2位判断文本文件的Encoding编码格式
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |