获取html页面时如何选择合适的Encoding

本文介绍了一种通过HTTP头部信息中的charset参数来确定HTML页面编码的方法,并提供了一个.NET示例程序来展示如何根据页面的实际编码正确读取内容。

当我们通过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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值