最近在做seo的工作,每次整理很多网站的排名都会很麻烦,索性自己做了个批量查询的小工具,最主要的就是得从网站源码中抓取数据,查询的时候会遇到各种各样的网站,多么奇葩的也有,为了确定网页的编码方式可绞尽脑汁。
开始是先在网上找了个判断乱码的方法,如果出现三个连续的byte数组239,191,189就说明是乱码
/// <summary> /// 判断是否为utf-8格式 /// </summary> /// <param name="txt"></param> /// <returns>是utf-8返回false,否则返回true</returns> private static bool isLuan(string txt) { var bytes = Encoding.UTF8.GetBytes(txt); //239 191 189 for (var i = 0; i < bytes.Length; i++) { if (i < bytes.Length - 3) if (bytes[i] == 239 && bytes[i + 1] == 191 && bytes[i + 2] == 189) { return true; } } return false; }
用了几次发现还是会出乱码,这种方法有时候会判断错误,而且便利一遍字符,效率肯定很低,于是想到了出现了乱码之后,其中的html标签并不会出现乱码于是取网页的charset头
Match charSetMatch = Regex.Match(pageHtmlu, "<meta([^<]*)charset=([^<\"]*)\"", RegexOptions.IgnoreCase | RegexOptions.Multiline); string s = charSetMatch.Groups[2].Value;
又测试了一下还是会出现乱码……郁闷ing……找原因,发现有的网页写的charset=utf-8,实际的编码却是gb2312
于是又找到了第三种方法,根据服务器返回的http头判断
MyWebClient.ResponseHeaders.Get("Content-Type")
会返回text/html charset=""但是很多网站只返回text/html没有编码方式,所能找到和想到的就这三种方法了,当然最保险的是先取http头,再去网页匹配charset,获得网页编码之后再遍历一遍,应该错误率是极低的,但是效率也会很低啊,最合适的方式只能是三个并列去判断了,http头>匹配charset>判断是否有乱码,测试了一下正确率也能达到95%以上,偶尔还是会出现乱码。
至于浏览器有没有更好的方法也没查到,可能也是用这些方式只是判断的方式会更复杂一些,种类会更多一些。