當前位置:
首頁 > 最新 > 編碼問題:網路數據處理的坑

編碼問題:網路數據處理的坑

網路爬蟲採集Web頁面、保存頁面內容時,最經常遇到的問題之一莫非是頁面的編碼問題了。你的爬蟲程序保存下來的頁面內容是否經常是下面的這種呢,有完全亂碼,有部分亂碼的。

解決這些問題,關鍵的是理解編碼。下面內容包括:字符集、編碼、Java的例子。

字符集

互聯網將世界各地的人們聯繫在一起,方便地共享信息,這就需要合適的字符集。

最常見的ASCII字符集,一個字元用一個位元組表示,然而漢字並不在其中。

GB2312是一個簡體中文字符集,由6763個常用漢字和682個全形的非漢字字元組成,通行於我國內地。

GBK共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁體字融於一庫,是漢字內碼擴展規範。

GBK是GB2312的一個超集,也就是說GB2312里的字GBK里都有,但是GBK里有的GB2312未必有。

Unicode稱為統一碼、萬國碼、單一碼,它為每種語言中的每個字元設定了統一併且唯一的二進位編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。

編碼

utf-8是對Unicode字符集進行編碼的一種編碼方式,它採用變長編碼方式,使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。

一個漢字在utf-8編碼的情況下可能需要三個位元組,使用gbk兩個位元組就足夠了。所以為了節省流量和硬碟,仍有很多gbk或者gbk2312編碼的網站。

當然,由於utf-8包含了全世界所有國家需要用到的字元,因此通用性強。使用utf-8編碼的文字/網頁可以在支持utf-8字符集的瀏覽器上顯示,外國人的英文IE上也能顯示中文,所以目前utf-8之類的網站數量最多。

Java爬蟲中的編碼處理

(1)

可以看到,主頁的源碼中: Content-Type: text/html; charset=UTF-8

這裡utf-8本身是頁面文件的編碼信息,寫在charset(字符集)的位置,說明了其使用unicode字符集,同時也指出了頁面文件的編碼方法。

URL u = new URL (url);

HttpURLConnection httpconn = (HttpURLConnection)u.openConnection();

InputStream in = httpconn.getInputStream ();

while ((n = in.read (buf, total, buf.length - total)) != -1) {

...

}

//將數據流(utf8編碼的) 轉成unicode

content = new String (buf,"utf-8");

File writefile=new File(filename);

OutputStreamWriter bw=new OutputStreamWriter(new FileOutputStream(writefile),"UTF-8");

bw.write(content);

(2)

對於http://down.admin5.com/php/82969.html這個網頁

其源碼中:

相應地,

//將數據流(gb2312編碼的) 轉成unicode

content = new String (buf,"gb2312");

File writefile=new File(filename);

OutputStreamWriter bw=new OutputStreamWriter(new FileOutputStream(writefile),"gb2312");

//當然此處,也可以使用utf-8

bw.write(content);

上述中,使用String(byte[] bytes, String encoding)構造字元串,encoding所指的是bytes中的數據是按照那種方式編碼的,可以從頁面編碼中找到其編碼方式。

其功能是把bytes中的數據由encoding編碼方式轉換成unicode編碼(java中的String類按照unicode進行編碼)。如果不指明encoding,bytes的編碼方式將由jdk根據操作系統決定,就可能出現亂碼。

OutputStreamWriter bw=new OutputStreamWriter(new FileOutputStream(writefile),"UTF-8"); //構建OutputStreamWriter對象,參數可以指定編碼,默認為操作系統默認編碼,windows上是gbk。因此,如果使用默認,也可能出現亂碼。

作者編著的《互聯網大數據處理技術與應用》專著(清華大學出版社,2017)、同名公眾號,專註於大數據技術的相關科學和工程知識傳播,同時也為讀者提供一些拓展閱讀材料。關注後可閱讀以前推送的原創文章,部分如下。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |