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


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

  • 相关阅读:
    预处理器宏指令(Macro)
    汇编语言中macro的用法
    USB设备的VID与PID
    前端工具 | JS编译器Monaco使用教程
    vue + ts中的shimsvue.d.ts文件的作用,在ts中引入vueecharts等vue文件 TypeScript 导入 JSON Module resolveJsonModule
    Jenkins自动打包并部署到远程服务器
    如何获取设备的VID,PID?
    TypeScript装饰器(decorators)
    MACRO指令
    IE6左右边框断线现象
  • 原文地址:https://www.cnblogs.com/orange-huihui/p/3284777.html
Copyright © 2020-2023  润新知