2012-05-09 49 views
2

我想创建一个可以检测文本文件的编码模式的方法。我知道那里有很多,但我确定我的文本文件是ASCII,UTF-8UTF-16。我只需要检测这三个。任何人都知道如何做到这一点?确定文本文件编码模式

+0

你知道他们是否有BOM(字节顺序标记)吗?如果是这样,您可以使用它来确定类型。 – alexn

+1

您可以安全地忽略ASCII。任何有效的ASCII文件始终是一个有效的UTF-8文件(假设您使用的是正确的7位ASCII定义)。 – Douglas

+0

如果没有物料清单,您就是SOL。 –

回答

1

使用StreamReader来识别编码。

实施例:

using(var r = new StreamReader(filename, Encoding.Default)) 
{ 
    richtextBox1.Text = r.ReadToEnd(); 
    var encoding = r.CurrentEncoding; 
} 
+1

您必须已经知道编码才能使用StreamReader。 – dan04

+1

这个答案是正确的。 [“StreamReader将尝试在尝试读取时自动检测文件的编码。”](http://stackoverflow.com/a/3746545/1149773) – Douglas

+1

此方法将回退到用户本地编码,如果它不是UTF8这可能是可取的。但是,如果没有BOM,它将无法检测到UTF8,即使它是完全有效的UTF8文本。 –

4

首先,在二进制模式打开该文件并读入存储器。

对于UTF-8(或ASCII),请进行验证检查。您可以使用Encoding.GetEncoding("UTF-8", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback).GetString(bytes)解码文本并捕获异常。如果你没有得到,数据是有效的UTF-8。下面是代码:

private bool detectUTF8Encoding(string filename) 
{ 
    byte[] bytes = File.ReadAllBytes(filename); 
    try { 
     Encoding.GetEncoding("UTF-8", EncoderFallback.ExceptionFallback, DecoderFallback.ExceptionFallback).GetString(bytes); 
     return true; 
    } catch { 
     return false; 
    } 
} 

对于UTF-16,检查是否有BOM(FE FFFF FE,这取决于字节顺序)。

+0

对于UTF-8,您还可以检查BOM:'EF BB BF'。如果存在,该检查将比解码文本更快地成功。 – Douglas

+0

**如果**存在。这对于UTF-8来说不是必需的,而且经常被省略,特别是在类Unix系统上。 – dan04

+1

是的,的确如此。但是由于这是一个快速检查,所以值得投入几次成功。 – Douglas