1. using System;
  2. using System.IO;
  3. using System.Text;
  4.  
  5. /// <summary>
  6. /// FileEncoding 的摘要说明
  7. /// </summary>
  8. namespace FileEncoding
  9. {
  10. /// <summary>
  11. /// 获取文件的编码格式
  12. /// </summary>
  13. public class EncodingType
  14. {
  15. /// <summary>
  16. /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型
  17. /// </summary>
  18. /// <param name="FILE_NAME">文件路径</param>
  19. /// <returns>文件的编码类型</returns>
  20. public static System.Text.Encoding GetType(string FILE_NAME)
  21. {
  22. FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
  23. Encoding r = GetType(fs);
  24. fs.Close();
  25. return r;
  26. }
  27.  
  28. /// <summary>
  29. /// 通过给定的文件流,判断文件的编码类型
  30. /// </summary>
  31. /// <param name="fs">文件流</param>
  32. /// <returns>文件的编码类型</returns>
  33. public static System.Text.Encoding GetType(FileStream fs)
  34. {
  35. byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 };
  36. byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 };
  37. byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM
  38. Encoding reVal = Encoding.Default;
  39.  
  40. BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
  41. int i;
  42. int.TryParse(fs.Length.ToString(), out i);
  43. byte[] ss = r.ReadBytes(i);
  44. if (IsUTF8Bytes(ss) || (ss[] == 0xEF && ss[] == 0xBB && ss[] == 0xBF))
  45. {
  46. reVal = Encoding.UTF8;
  47. }
  48. else if (ss[] == 0xFE && ss[] == 0xFF && ss[] == 0x00)
  49. {
  50. reVal = Encoding.BigEndianUnicode;
  51. }
  52. else if (ss[] == 0xFF && ss[] == 0xFE && ss[] == 0x41)
  53. {
  54. reVal = Encoding.Unicode;
  55. }
  56. r.Close();
  57. return reVal;
  58.  
  59. }
  60.  
  61. /// <summary>
  62. /// 判断是否是不带 BOM 的 UTF8 格式
  63. /// </summary>
  64. /// <param name="data"></param>
  65. /// <returns></returns>
  66. private static bool IsUTF8Bytes(byte[] data)
  67. {
  68. int charByteCounter = ; //计算当前正分析的字符应还有的字节数
  69. byte curByte; //当前分析的字节.
  70. for (int i = ; i < data.Length; i++)
  71. {
  72. curByte = data[i];
  73. if (charByteCounter == )
  74. {
  75. if (curByte >= 0x80)
  76. {
  77. //判断当前
  78. while (((curByte <<= ) & 0x80) != )
  79. {
  80. charByteCounter++;
  81. }
  82. //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X
  83. if (charByteCounter == || charByteCounter > )
  84. {
  85. return false;
  86. }
  87. }
  88. }
  89. else
  90. {
  91. //若是UTF-8 此时第一位必须为1
  92. if ((curByte & 0xC0) != 0x80)
  93. {
  94. return false;
  95. }
  96. charByteCounter--;
  97. }
  98. }
  99. if (charByteCounter > )
  100. {
  101. throw new Exception("非预期的byte格式");
  102. }
  103. return true;
  104. }
  105.  
  106. }
  107.  
  108. }

来自转载

C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)-来自转载收集的更多相关文章

  1. C#获取文本文件的编码,自动区分GB2312和UTF8

    C# 获取文本文件的编码,自动区分GB2312和UTF8 以下是获取文件编码的一个类 using System; using System.IO; using System.Text; /// < ...

  2. 字符编码笔记:ASCII,Unicode和UTF-8【转载】

    作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...

  3. 字符编码笔记:ASCII,Unicode和UTF-8(转载)

    注:我注释的地方有 add by zhj.另Unicode.UTF-8.GB2312查询http://www.2fz1.com/so/ 在python中,a.decode(xxx)就是把str类型的字 ...

  4. [C#.net]获取文本文件的编码,自动区分GB2312和UTF8

    昨天生产突然反馈上传的结果查询出现了乱码,我赶紧打开后台数据库,发现果真有数据变成了乱码.这个上传程序都运行3个多月了,从未发生乱码现象,查看程序的运行日志,发现日志里的中文都变成了乱码,然后对比之前 ...

  5. [No000040]取得一个文本文件的编码方式

    using System; using System.IO; using System.Text; /// <summary> /// 用于取得一个文本文件的编码方式(Encoding). ...

  6. Atitit.检测文本文件的编码 自动获取文件的中文编码

    Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...

  7. python文件(概念、基本操作、常用操作、文本文件的编码方式)

    文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...

  8. 获取文本的编码类型(from logparse)

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F ...

  9. 获取文本文件的第N行内容

    在PowerShell中,可以通过Get-Content这个cmdlet来获取文本文件的内容.Get-Content将一个文本文件读取到一个数组中,每一个数组元素就是文件的一行内容.比如一个文本文件内 ...

随机推荐

  1. 【转载】让你的MATLAB代码飞起来

    原文地址:http://developer.51cto.com/art/201104/255128_all.htm MATLAB语言是一种被称为是"演算纸"式的语言,因此追求的是方 ...

  2. 常用的shell命令

    作为一名有10年以上使用年龄的Linux/MacOSX用户来说,键盘的作用往往要远大于鼠标.而且,作为一个黑客文化的追随者,我也希望越来越多的用户能认识到命令行的潜在价值,不要把它视为只是计算机专家们 ...

  3. X86 Socket 通信

    struct txd_socket_handler_t { int fd; }; txd_socket_handler_t *txd_tcp_socket_create() { txd_socket_ ...

  4. SQL 行转列和列转行

    SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...

  5. mac电脑的使用

    1. control + command + a 截图 2. shift + command + g 前往 3.在 Mac OS X 中怎样获取当前文件夹的路径 原文网址:https://www.zh ...

  6. docker 私有镜像管理工具harbor 安装

    因为各种原因,官方的离线安装包下载比较费事,经常不成功,所以通过分部安装解决问题 1. docker yum install libdevmapper* -y -H tcp://0.0.0.0:237 ...

  7. github上传本地项目

    github上传本地项目,分为两个部分: 1.如果建立了ssh key的,直接看第二部分的上传部分就行了 2.如果没有建立ssh key的,就从头开始看吧 ——————————————————我是快乐 ...

  8. Qt多重继承时的信号与槽

    最近在公司项目中开发串口,因为历史原因串口要包装一下,且包装类需要继承自一个纯C++类. QSerialPort可以使用slot function来获取从串口读到的数据,以及写入串口的bytes个数. ...

  9. [linux] linux shell 将解析完毕的文件备份至其他目录

    #!/bin/bash # #将解析完毕的日志备份到别的目录 # #日志目录 rjPath=`ls /home/bgftp/orj` #当前时间戳 cur=`date +%s` #一小时 chtm=3 ...

  10. Oracle定时计划快速使用

    Oracle定时计划快速使用 前言: SQL Server中有相关的定时计划,可以直接打开sql server 的任务管理器进行配置,可以方便.快速实现定时执行相应任务.相应的Oracle也有对应的定 ...