zoukankan      html  css  js  c++  java
  • 浏览器是怎样确定编码方式的

          最近在做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%以上,偶尔还是会出现乱码。
    至于浏览器有没有更好的方法也没查到,可能也是用这些方式只是判断的方式会更复杂一些,种类会更多一些。

  • 相关阅读:
    华南虎原图找到了
    电脑高手的7大标准
    科幻小说一代宗师阿瑟•克拉克过逝
    看英文片最容易误解的10个单词(感觉对大家很有用,转过来的)
    地震了,人跑的真快啊
    John Titor一个来自未来的人
    马云扮白雪公主
    世界上最冷的脑筋急转弯
    告别人肉刷,让房源自己送上门
    来测下你的浏览器对标准的支持情况吧
  • 原文地址:https://www.cnblogs.com/orange-huihui/p/3284777.html
Copyright © 2011-2022 走看看