java获取页面编码

文章出自: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
posted @ 2014-12-24 10:46  zhangj95  阅读(567)  评论(0编辑  收藏  举报