java根據URL獲取網頁編碼

因爲不少緣由,咱們要獲取網頁的編碼(多半是寫批量抓取的腳本吧...嘻嘻嘻)html

注意:java

若是你的目的是獲取不亂碼的網頁內容(而不是根據網址發送post請求獲取返回值),切記切記,移步這裏windows

java根據URL獲取HTML內容

先說思路:網絡

有三種方法:post

1,根據responseHeaders獲取Content-Type裏的charset,以下圖網站

這種方法最好,最推薦,然而,不少網站都沒有,要麼是像百度這樣:編碼

有Content-Type,然而沒有指定charseturl

要麼是像博客園這樣:spa

???Content-Type都不給我麼...???debug

因此雖然這種方法最準確.可是...並非每一個網站都有的...

2.根據html標籤裏的meta取

這裏還以百度爲例:

怎麼取標籤,我就不說了,若是不會就留言,若有須要我再寫博客(然而也沒什麼人看我博客,更沒什麼人會留言...悲傷...我就默認大家都會取了)

雖然中文亂碼,可是英文是不亂的,哪怕你不知道編碼,隨便用個GBK,UTF-8都能取...

可是,這種方法不許...不保證必定能取到正確的

而且..因爲這種方法你還得拿到HTML內容...因此,還得判斷一下是否是GZIP方式壓縮了...賊麻煩...因此我就放棄了

3.經過第三方庫,去猜格式

這種方法,原則上講是存在必定的猜錯概率的...

原理是同時進行多種編碼的嘗試(gb2312啊,utf-8啊,windows-XXXX啊),哪一個先返回正確的格式就認定是哪一個...雖然根據個人嘗試很準,然而理論上仍是會不貼切的,沒有第一種準.

文件下載:http://files.cnblogs.com/files/blog5277/cpdetector_1.0.10_binary.zip

切記切記,總共是4個jar包...別的教程裏並無告訴我,害得我分別去找這三個編碼jar包,好氣...最後才發現原來就在這個壓縮包裏...吃了眼瞎的虧了

這四個jar包放進你項目裏就行

最後,通過慎重的考慮與取捨,我決定先用第一種方法取(畢竟最準確),放棄第二種方法(賊麻煩...),第一種取不到了,再用第三種猜,以下

public static String getUrlCharset(String url){
        try {
            String urlNameString = url;
            URL realUrl = new URL(urlNameString);
            // 打開和URL之間的鏈接
            URLConnection connection = realUrl.openConnection();
            // 設置通用的請求屬性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 創建實際的鏈接
            connection.connect();
            // 獲取全部響應頭字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍歷全部的響應頭字段
            System.out.println("Content-Type" + "--->" + map.get("Content-Type"));
            List<String> list=map.get("Content-Type");
            if (list.size()>0){
                String contentType=list.toString().toUpperCase();
                if (contentType.contains("UTF-8")){
                    return "UTF-8";
                }
                if(contentType.contains("GB2312")){
                    return "GB2312";
                }
                if (contentType.contains("GBK")){
                    return "GBK";
                }
            }

            //若是相應頭裏面沒有編碼格式,用下面這種
            CodepageDetectorProxy codepageDetectorProxy = CodepageDetectorProxy.getInstance();
            codepageDetectorProxy.add(JChardetFacade.getInstance());
            codepageDetectorProxy.add(ASCIIDetector.getInstance());
            codepageDetectorProxy.add(UnicodeDetector.getInstance());
            codepageDetectorProxy.add(new ParsingDetector(false));
            codepageDetectorProxy.add(new ByteOrderMarkDetector());
            Charset charset = codepageDetectorProxy.detectCodepage(new URL(url));
            return charset.name();
        }catch (Exception e){}
        return null;
    }

若是返回值是null,那很不幸,我也不知道哪裏出異常了,本身debug解決吧,嘻嘻.通常是沒事.最多就是網絡很差timeout了

就這樣

相關文章
相關標籤/搜索