码迷,mamicode.com
首页 > 编程语言 > 详细

java获取页面编码

时间:2014-12-24 11:36:57      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

文章出自:http://babyjoycry.javaeye.com/blog/587527 在此感谢原作者...\(^o^)/~
 
最近研究抓取网页内容,发现要获取页面的编码格式,Java没有现成的实现方法,虽然csdn上有个达人写了一篇文章,附有代码,可惜,我没有找到相关的包,不得已,只好自己动手丰衣足食了。
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

import cpdetector.io.CodepageDetectorProxy; 
import cpdetector.io.HTMLCodepageDetector; 
import cpdetector.io.JChardetFacade; 

public class PageEncodeDetector { 
  private static CodepageDetectorProxy detector = CodepageDetectorProxy 
      .getInstance(); 

  static { 
    detector.add(new HTMLCodepageDetector(false)); 
    detector.add(JChardetFacade.getInstance()); 
  } 

  /** 
    * 测试用例 
    *    
    * @param args 
    */ 
  public static void main(String[] args) { 
    PageEncodeDetector web = new PageEncodeDetector(); 
    try { 
      System.out.println(web.getCharset("http://www.baidu.com/")); 
    } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
  } 

  /** 
    * @param strurl 
    *                        页面url地址,需要以 http://开始,例:http://www.pujia.com 
    * @return 
    * @throws IOException 
    */ 
  public String getCharset(String strurl) throws IOException { 
    // 定义URL对象 
    URL url = new URL(strurl); 
    // 获取http连接对象 
    HttpURLConnection urlConnection = (HttpURLConnection) url 
        .openConnection(); 
    ; 
    urlConnection.connect(); 
    // 网页编码 
    String strencoding = null; 

    /** 
     * 首先根据header信息,判断页面编码 
     */ 
    // map存放的是header信息(url页面的头信息) 
    Map<String, List<String>> map = urlConnection.getHeaderFields(); 
    Set<String> keys = map.keySet(); 
    Iterator<String> iterator = keys.iterator(); 

    // 遍历,查找字符编码 
    String key = null; 
    String tmp = null; 
    while (iterator.hasNext()) { 
      key = iterator.next(); 
      tmp = map.get(key).toString().toLowerCase(); 
      // 获取content-type charset 
      if (key != null && key.equals("Content-Type")) { 
        int m = tmp.indexOf("charset="); 
        if (m != -1) { 
          strencoding = tmp.substring(m + 8).replace("]", ""); 
          return strencoding; 
        } 
      } 
    } 

    /** 
     * 通过解析meta得到网页编码 
     */ 
    // 获取网页源码(英文字符和数字不会乱码,所以可以得到正确<meta/>区域) 
    StringBuffer sb = new StringBuffer(); 
    String line; 
    try { 
      BufferedReader in = new BufferedReader(new InputStreamReader(url 
          .openStream())); 
      while ((line = in.readLine()) != null) { 
        sb.append(line); 
      } 
      in.close(); 
    } catch (Exception e) { // Report any errors that arise 
      System.err.println(e); 
      System.err 
          .println("Usage:     java     HttpClient     <URL>     [<filename>]"); 
    } 
    String htmlcode = sb.toString(); 
    // 解析html源码,取出<meta />区域,并取出charset 
    String strbegin = "<meta"; 
    String strend = ">"; 
    String strtmp; 
    int begin = htmlcode.indexOf(strbegin); 
    int end = -1; 
    int inttmp; 
    while (begin > -1) { 
      end = htmlcode.substring(begin).indexOf(strend); 
      if (begin > -1 && end > -1) { 
        strtmp = htmlcode.substring(begin, begin + end).toLowerCase(); 
        inttmp = strtmp.indexOf("charset"); 
        if (inttmp > -1) { 
          strencoding = strtmp.substring(inttmp + 7, end).replace( 
              "=", "").replace("/", "").replace("\"", "") 
              .replace("\‘", "").replace(" ", ""); 
          return strencoding; 
        } 
      } 
      htmlcode = htmlcode.substring(begin); 
      begin = htmlcode.indexOf(strbegin); 
    } 

    /** 
     * 分析字节得到网页编码 
     */ 
    strencoding = getFileEncoding(url); 

    // 设置默认网页字符编码 
    if (strencoding == null) { 
      strencoding = "GBK"; 
    } 

    return strencoding; 
  } 

  /** 
    *    
    *<br> 
    * 方法说明:通过网页内容识别网页编码 
    *    
    *<br> 
    * 输入参数:strUrl 网页链接; timeout 超时设置 
    *    
    *<br> 
    * 返回类型:网页编码 
    */ 
  public static String getFileEncoding(URL url) { 

    java.nio.charset.Charset charset = null; 
    try { 
      charset = detector.detectCodepage(url); 
    } catch (Exception e) { 
      System.out.println(e.getClass() + "分析" + "编码失败"); 
    } 
    if (charset != null) 
      return charset.name(); 
    return null; 

  } 

} 

  需要下载cpdetector_1.0.5.jar 和 chardet.jar

java获取页面编码

标签:

原文地址:http://www.cnblogs.com/zhangj95/p/4181908.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!