漢字編碼是一項較為麻煩的事情,弄不好就會造出些誰都看不懂的亂碼。比如我想做個針對漢字網站的爬蟲系統,需要對非特定的頁面進行資料解析處理,而此時我所通路的頁面編碼格式未知,如果不能正确處理頁面編碼,則很難獲得我們理想中的資料。
通常這時候可能有幾種選擇:
一是根據response的ContentType獲得,如果伺服器支援的話此項中會傳回charset數值,解析即可。但對不傳回或者不支援的伺服器則無能為力。
二是使用正則或自定義解析函數截取頁面中‘charset=’後的資料,采取死釘戰術,但萬一采集的頁面中沒有此項或者此項有錯,也就回天乏術。
三就是老老實實的解析全文,最後傳回一個符合的編碼格式。
此例中我示範了幾種較常見編碼的識别方法,通過統計編碼為指定編碼的或然率, 而後傳回可能性最高的編碼方式。在無法獲得确切編碼之時,這可說是一種唯一的選擇。
這種識别方式主要是針對漢字編碼而來,是以對應頁面中的漢字數目越多,統計結果就越準确,反之則很難識别出正确結果。
Encoding.java

package org.loon.test.encoding;

/**
* <p>
* Title: LoonFramework
* </p>
* De.ion:編碼基本類型集合
* Copyright: Copyright (c) 2008
* Company: LoonFramework
* License: http://www.apache.org/licenses/LICENSE-2.0
*
* @author chenpeng
* @email:[email protected]
* @version 0.1
*/
public class Encoding {
// 支援的字元格式
public static int GB2312 = 0;
public static int GBK = 1;
public static int BIG5 = 2;
public static int UTF8 = 3;
public static int UNICODE = 4;
public static int EUC_KR = 5;
public static int SJIS = 6;
public static int EUC_JP = 7;
public static int ASCII = 8;
public static int UNKNOWN = 9;
public static int TOTALT = 10;
public final static int SIMP = 0;
public final static int TRAD = 1;
// 解析名稱用
public static String[] javaname;
// 編碼用
public static String[] nicename;
// 應用于html中的字元集
public static String[] htmlname;
public Encoding() {
javaname = new String[TOTALT];
nicename = new String[TOTALT];
htmlname = new String[TOTALT];
javaname[GB2312] = "GB2312";
javaname[GBK] = "GBK";
javaname[BIG5] = "BIG5";
javaname[UTF8] = "UTF8";
javaname[UNICODE] = "Unicode";
javaname[EUC_KR] = "EUC_KR";
javaname[SJIS] = "SJIS";
javaname[EUC_JP] = "EUC_JP";
javaname[ASCII] = "ASCII";
javaname[UNKNOWN] = "ISO8859_1";
// 配置設定編碼名稱
htmlname[GB2312] = "GB2312";
htmlname[GBK] = "GBK";
htmlname[BIG5] = "BIG5";
htmlname[UTF8] = "UTF-8";
htmlname[UNICODE] = "UTF-16";
htmlname[EUC_KR] = "EUC-KR";
htmlname[SJIS] = "Shift_JIS";
htmlname[EUC_JP] = "EUC-JP";
htmlname[ASCII] = "ASCII";
htmlname[UNKNOWN] = "ISO8859-1";
// 配置設定可讀名稱
nicename[GB2312] = "GB-2312";
nicename[GBK] = "GBK";
nicename[BIG5] = "Big5";
nicename[UTF8] = "UTF-8";
nicename[UNICODE] = "Unicode";
nicename[EUC_KR] = "EUC-KR";
nicename[SJIS] = "Shift-JIS";
nicename[EUC_JP] = "EUC-JP";
nicename[ASCII] = "ASCII";
nicename[UNKNOWN] = "UNKNOWN";
}
public String toEncoding(final int type) {
return (javaname[type] + "," + nicename[type] + "," + htmlname[type])
.intern();
}

Encode,java(省略,見源碼)
本文轉自 cping 51CTO部落格,原文連結:http://blog.51cto.com/cping1982/129912