zoukankan      html  css  js  c++  java
  • 获取html页面时如何选择合适的Encoding

    当我们通过webrequest或其它socket方式获取一个html页面时,获取到的是一个tcp流,保存后也是一个字节数组。为了获取它的信息,还需将其解析为字符串。

    解析的方式很简单,下面两句话即可轻松完成。

    var reader = new StreamReader(rsp.GetResponseStream());
    var html = reader.ReadToEnd();

    常用.net的IO库的朋友一看就知道,这种方式无法对中文页面解析,解析出来的中文是乱码,为了正确的解析中文,还需要选择合适的编码方式。

    然而,中文的编码方式有很多种,常见的就有gb2312、utf-8、utf-16等。我以前通常是直接使用Encoding.Default来获取系统默认编码方式。这种方式大多数情况下使用,然而对于那些采用utf-8等方式的网页就无法解析。

    如何获取页面的编码方式呢?答案在httphead的头信息中的charset信息中。然而有些网页却不包含charset的httphead。对于这些网页,大可以像我以前那样直接用系统默认编码。

    一个简单的示例如下:

        static void Main(string[] args)
        {
            string url = "http://www.163.com";

            var req = WebRequest.Create(url);
            var rsp = req.GetResponse() as HttpWebResponse;

            var match = System.Text.RegularExpressions.Regex.Match(rsp.Headers.ToString(), "charset=(.+)");

            var encodname = match.Groups[1].Value.Trim();
            var encoder = match.Success ? Encoding.GetEncoding(encodname) : Encoding.Default;
            var reader = new StreamReader(rsp.GetResponseStream(), encoder);
            var html = reader.ReadToEnd();
            Console.WriteLine(html);
        }

  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/TianFang/p/1211359.html
Copyright © 2011-2022 走看看