如何找出文件的编码? C#

好吧,我需要找出我在某个目录中找到的文件是UTF8编码的ANSI编码,以改变我以后决定的其他东西的编码。 我的问题是..如何判断文件是UTF8还是ANSI编码? 这两种编码实际上都可以在我的文件中找到。

没有可靠的方法(因为文件可能只是随机二进制),但Windows记事本软件完成的过程在Micheal S Kaplan的博客中有详细说明:

http://www.siao2.com/2007/04/22/2239345.aspx

  1. 检查前两个字节; 1.如果有UTF-16 LE BOM,则将其作为“Unicode”文件处理(并加载); 2.如果存在UTF-16 BE BOM,则将其作为“Unicode(Big Endian)”文件处理(并加载); 3.如果前两个字节看起来像是UTF-8 BOM的开头,那么检查下一个字节,如果我们有一个UTF-8 BOM,那么将其作为“UTF-8”文件处理(并加载);
  2. 检查IsTextUnicode以查看该函数是否认为它是无BOM的UTF-16 LE,如果是,则将其作为“Unicode”文件处理(并加载);
  3. 检查它是否使用1998年的原始RFC 2279定义UTF-8,然后将其作为“UTF-8”文件处理(并加载);
  4. 使用计算机的默认系统代码页假设ANSI文件。

现在请注意,这里有一些漏洞,比如第2步没有使用无BOM的UTF-16 BE那么好(这里甚至可能有一个bug,我不确定 – 如果是这样的话,那就是一个bug在记事本中超出IsTextUnicode中的任何错误)。

http://msdn.microsoft.com/en-us/netframework/aa569610.aspx#Question2

没有很好的方法来检测任意ANSI代码页,尽管有一些尝试是基于文本中间某些字节序列的概率来做到这一点。 我们不在StreamReader中尝试。 一些文件格式(如XML或HTML)可以在文件的第一行指定字符集,因此Web浏览器,数据库和类(如XmlTextReader)可以正确读取这些文件。 但是许多文本文件没有内置这种类型的信息。

Unicode / UTF8 / UnicodeBigEndian被认为是不同的类型。 ANSI被认为与UTF8相同。

 public class EncodingType { public static System.Text.Encoding GetType(string FILE_NAME) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); Encoding r = GetType(fs); fs.Close(); return r; } public static System.Text.Encoding GetType(FileStream fs) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //with BOM Encoding reVal = Encoding.Default; BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out 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(); return reVal; } 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++; } if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("Error byte format"); } return true; } } 

请参阅这两个代码项目文章 – 仅从文件内容中找出文件编码并非易事:

  • 从ByteOrderMarks(BOM)检测编码
  • 检测输入和输出文本的编码