1. 程式人生 > >Jsoup爬取網頁亂碼編碼格式gb2312轉utf8

Jsoup爬取網頁亂碼編碼格式gb2312轉utf8

最近做的一個專案需要爬取股票公告並存儲於mongodb中用來顯示,當我在用jsoup爬取新浪財經股票公告的時候,發現了亂碼問題。網頁連結如下http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletinDetail.php?stockid=600958&id=3735125,開啟控制檯可以看到新浪財經採用的是gb2312的編碼方式,mongodb預設utf8,其實簡體中文不做編碼轉換也是可以儲存,但是例如繁體中文以及特殊字元就會出現亂碼問題。於是寫了段程式來統一編碼格式,程式碼如下:

//獲取公告
public String getAnnouncementFromSina(){
	String text = "";
	String url = "http://vip.stock.finance.sina.com.cn/corp/view/vCB_AllBulletinDetail.php?stockid=600958&id=3735125";
	try{
		Document doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);
		Element element = doc.select("div#content").first().getElementsByTag("pre").first();
		
		//呼叫轉換方法
		text = getUTF8BytesFromGBKString(element.text());
	}catch (Exception e){
		e.printStackTrace();
		return null;
	}	


	return text

}


//有損轉換
public String getUTF8BytesFromGBKString(String gbkStr) throws UnsupportedEncodingException {
    int n = gbkStr.length();
    byte[] utfBytes = new byte[3 * n];
    int k = 0;
    for (int i = 0; i < n; i++) {
        int m = gbkStr.charAt(i);
        if (m < 128 && m >= 0) {
            utfBytes[k++] = (byte) m;
            continue;
        }
        utfBytes[k++] = (byte) (0xe0 | (m >> 12));
        utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
        utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
    }
    if (k < utfBytes.length) {
        byte[] tmp = new byte[k];
        System.arraycopy(utfBytes, 0, tmp, 0, k);
        utfBytes = tmp;


    }
    return new String(utfBytes,"UTF-8");
}
如有錯誤,歡迎糾正!