分享

utf8网页的问题

 素行 2007-05-07

在myeclipse中建立java项目,目的看看我那个爬虫乱麻现象的原因;

在数据库中找到乱麻的数据项,然后再ie中输入其url,发现网页的编码是utf-8的格式

bot包中http类有个getbody方法,作用是得到当前网页的源文件,http类通过send方法发送请求,看看下http类的原代码,发现getbody有个重载函数,参数为编码格式。之后输出getbody("utf-8")发现乱麻问题解决。

实际上这个问题属于java内部编码问题,比如下端代码

URL url=new URL(http://www.yahoo.cn); //此网页由utf-8的网页

URLConnection con
=url.openconnection();

con.connection();

InputStream in
=con.getInputStream();

InputStreamReader isr
=new InputStreamReader(in);

BufferedReader br
=new BufferReader(isr);

String temp
=null;

while(null!=(temp=br.readline())){

System.out.println(temp);

}

 

这样中文就显示乱麻,如果被打开的网页编码是gb2312的时候,上断程序就能正常显示中文。

现在我们来解决为什么能这样。先来看InputStreamReader的构造函数

InputStreamReader(InputStream in)
          创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs)
          创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec)
          创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName)
          创建使用指定字符集的 InputStreamReader。

可以发现,我们使用的是第一个构造函数,它使用的是缺省的字符集,从来面的例子可以看出,缺省的字符集应该是unicode-16的,所以在读取utf-8的网页时会发生乱码。我们可以使用第4个构造函数。来指定采用字符即得名字。把上面的改称inputstreamReader isr=new inputStreamReader(in,"utf-8");这样在处理utf-8网页的时候就不乱码了。如果进一步的话可以用正则表达式来获取网页中charset,

  Pattern p=Pattern.compile("charset\\s*=\\s*([^\"]+)");
  Matcher m=p.matcher(new String(temp));

 m.group(1)就是目标网页的编码方式。temp为html的源代码

这样便可以不用自己来判断了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多