因爲不少緣由,咱們要獲取網頁的編碼(多半是寫批量抓取的腳本吧...嘻嘻嘻)html
注意:java
若是你的目的是獲取不亂碼的網頁內容(而不是根據網址發送post請求獲取返回值),切記切記,移步這裏windows
先說思路:網絡
有三種方法: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了
就這樣