Discuz论坛源码的编码自动分析

本文介绍了一种在C#中获取论坛HTML源码时自动识别其编码方式的方法,通过正则表达式从网页源码中提取编码信息,解决了因编码不匹配导致的乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近论坛助手项目遇到需要好获取论坛源码的问题,而不同的论坛可能采用不用的编码方式,因此如果采用统一的编码来获取论坛源码,那么获得的源码很有可能是乱码,所以需要先知道论坛HTML源码的编码方式,然后再按该编码方式获取源码。

根据网上的资料,使用WebClient来获取源码,很容易就能得到网页源码。在C#里,提供了丰富的工具类库,可以轻松的转码。但是,却发现不能自动获取网站上的字符编码而自动正确的解释源码,而导致汉字显示乱码。同样,在JAVA的各种获取网站源码的类库里,也不能自动根据网页字符编码自动正确解释编码,只能我们自己手动来做了。

我的解决办法是先采用系统默认的编码从 stream里得到源码,再使用正则表达式获取源码中的[获取网页字符编码描述信息],这个信息,一般来说,网页里都会有的,在网页源码的<head>里,类似这样的代码:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />(其实不一样完全这样,有些不规范的,没有双引号,或者最后面没有/闭合,所以,正则表达式得考虑周全些),从这个代码里来获取编码信息,再用网页中获取到得编码来重新从stream里解释取得网页源码。

源码如下:

public string getContent(Uri uri, CookieContainer cc)

{

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(uri);

myRequest.CookieContainer = cc;

WebResponse response = myRequest.GetResponse();

Stream streamIn = response.GetResponseStream();

StreamReader reader = new StreamReader(streamIn, Encoding.Default);//Encoding.GetEncoding("GBK")

string stringResponse = reader.ReadToEnd();

Match charSetMatch = Regex.Match(stringResponse, "<meta([^<]*)charset=([^<]*)/"", RegexOptions.IgnoreCase | RegexOptions.Multiline);

string charSet = charSetMatch.Groups[2].Value;

charSet = charSet.ToUpper();

myRequest = (HttpWebRequest)WebRequest.Create(uri);

myRequest.CookieContainer = cc;

response = myRequest.GetResponse();

streamIn = response.GetResponseStream();

switch (charSet)

{

case "UTF-8":

reader = new StreamReader(streamIn, Encoding.UTF8);

break;

case "GBK":

reader = new StreamReader(streamIn, Encoding.GetEncoding("GBK"));

break;

case "BIG5":

reader = new StreamReader(streamIn, Encoding.GetEncoding("BIG5"));

break;

case "GB2312":

reader = new StreamReader(streamIn, Encoding.GetEncoding("GB2312"));

break;

}

stringResponse = reader.ReadToEnd();

reader.Close();

streamIn.Close();

response.Close();

return stringResponse;

}

先用系统默认的编码获取论坛HTML源码,StreamReader的第二个参数设置为Encoding.Default,此时获得的源码可能包含乱码,但是<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />这个代码可以正确解析,因此可以通过正规式获得该网页的编码方式,正规式编写如下"<meta([^<]*)charset=([^<]*)/""/为转义符),获得正确编码后再重复以上步骤,只是将StreamReader的第二个参数设置成刚获得的编码方式,然后就可以获得正确的编码方式了。

PS:代码部分参考网上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值