浏览器是怎样确定编码方式的

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

转载于:https://www.cnblogs.com/orange-huihui/p/3284777.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值