例如,一段编码为
xzp4kabfqj3kzau90mj2bytj6380c
如何测出它是gb2312、还是UTF-8、还是其它什么charset

解决方案 »

  1.   

    public class EncodingType{
        public static System.Text.Encoding GetType(string FILE_NAME)
        {
            FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            System.Text.Encoding r = GetType(fs);
            fs.Close();
            return r;
        }
        public static System.Text.Encoding GetType(FileStream fs)
        {
            /*byte[] Unicode=new byte[]{0xFF,0xFE};
            byte[] UnicodeBIG=new byte[]{0xFE,0xFF};
            byte[] UTF8=new byte[]{0xEF,0xBB,0xBF};*/        BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default);
            byte[] ss = r.ReadBytes(3);
            r.Close();
            //编码类型 Coding=编码类型.ASCII;
            if (ss[0] >= 0xEF)
            {
                if (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)
                {
                    return System.Text.Encoding.UTF8;
                }
                else if (ss[0] == 0xFE && ss[1] == 0xFF)
                {
                    return System.Text.Encoding.BigEndianUnicode;
                }
                else if (ss[0] == 0xFF && ss[1] == 0xFE)
                {
                    return System.Text.Encoding.Unicode;
                }
                else
                {
                    return System.Text.Encoding.Default;
                }
            }
            else
            {
                return System.Text.Encoding.Default;
            }
        }

      

  2.   

    3楼的肯定不对……LZ的问题是给一段特定编码的流,判断其所用编码
    你那代码是验证文件BOM头就算LZ也是要验证文件编码,也不能保证每个Unicode文件都有BOM头啊。LZ这个问题需要参考Unicode和GB2312对应的编码定义,多字节字符中,每个字节序列特定字节上可以出现的值是特定的,例如GB2312中如果头一个字节是0xA1,那后一个字节只能是0xA1到0xFE之间的值,而UTF-8中,如果发现一个字节是0xA1,那么它只能是一个多字节序列的第二个字节。话说这个问题并不是那么简单,如果是一个短语,那判断出错的几率很高php中有mb_stringencoding(或者类似)的一个函数,用于判断编码,也是经常出错的Ultraedit32有判断编码的功能,也是经常出错,LZ最好换个思路。
      

  3.   

    网上找到一段代码,但好像不是C#的,谁能将下列代码改成C#代码:1、判断是否是GB2312  
    bool isGBCode(const string& strIn)  
    {  
    unsigned char ch1;  
    unsigned char ch2;  if (strIn.size() >= 2)  
    {  
    ch1 = (unsigned char)strIn.at(0);  
    ch2 = (unsigned char)strIn.at(1);  
    if (ch1 >=176 && ch1 <=247 &&ch2 >=160 && ch2 <=254)  
    return true;  
    else return false;  
    }  
    else return false;  
    }  
    2、判断是否是GBK编码  
    bool isGBKCode(const string& strIn)  
    {  
    unsigned char ch1;  
    unsigned char ch2;  if (strIn.size() >= 2)  
    {  
    ch1 = (unsigned char)strIn.at(0);  
    ch2 = (unsigned char)strIn.at(1);  
    if (ch1 >=129 && ch1 <=254 &&ch2 >=64 && ch2 <=254)  
    return true;  
    else return false;  
    }  
    else return false;  
    }  
      

  4.   

    搜索引擎只查看Header,而Header中就指定了字符集