Discuz论坛源码的编码自动分析
2011-02-24 09:14
309 查看
最近论坛助手项目遇到需要好获取论坛源码的问题,而不同的论坛可能采用不用的编码方式,因此如果采用统一的编码来获取论坛源码,那么获得的源码很有可能是乱码,所以需要先知道论坛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:代码部分参考网上
根据网上的资料,使用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:代码部分参考网上
相关文章推荐
- Discuz!!论坛wap功能模块编码的注射漏洞分析
- MINA源码分析---协议编码解码过滤器ProtocolCodecFilter
- 实战从源码编译LAMP架构+Discuz搭建bbs论坛
- Discuz论坛短信群发、动网自动发贴源代码
- SpringMVC关于json、xml自动转换的原理研究[附带源码分析]
- 多站点RSS新闻正文抓取,导入discuz论坛,自动发帖的实现(一)
- 多站点RSS新闻正文抓取,导入discuz论坛,自动发帖的实现(三)
- Discuz! X论坛上传附件到100%自动取消上传的原因及解决方案
- Discuz X3.2源码解析 论坛模块(forum.php)转自百度
- Discuz! X2 核心类源码分析-discuz_core
- DISCUZ源码分析流程详细介绍【admin.php入口】
- PYTHON实现DISCUZ论坛的自动POST登录发贴回帖
- discuz源码的一点分析
- QTP自动例子的源码分析--ClearMainWindow
- 基于TCP网络通信的自动升级程序源码分析--生成升级文件相关的配置文件
- VS2013中将新建的源码文件的编码格式自动设置成UTF8
- Yii2.0源码分析之——YiiBase自动加载类、引用文件(autoload)
- Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用
- Discuz! X论坛上传附件到100%自动取消上传的原因及解决方案