天天看點

java字元串編碼類型擷取

漢字編碼是一項較為麻煩的事情,弄不好就會造出些誰都看不懂的亂碼。比如我想做個針對漢字網站的爬蟲系統,需要對非特定的頁面進行資料解析處理,而此時我所通路的頁面編碼格式未知,如果不能正确處理頁面編碼,則很難獲得我們理想中的資料。

通常這時候可能有幾種選擇:

一是根據response的ContentType獲得,如果伺服器支援的話此項中會傳回charset數值,解析即可。但對不傳回或者不支援的伺服器則無能為力。

二是使用正則或自定義解析函數截取頁面中‘charset=’後的資料,采取死釘戰術,但萬一采集的頁面中沒有此項或者此項有錯,也就回天乏術。

三就是老老實實的解析全文,最後傳回一個符合的編碼格式。

此例中我示範了幾種較常見編碼的識别方法,通過統計編碼為指定編碼的或然率, 而後傳回可能性最高的編碼方式。在無法獲得确切編碼之時,這可說是一種唯一的選擇。

這種識别方式主要是針對漢字編碼而來,是以對應頁面中的漢字數目越多,統計結果就越準确,反之則很難識别出正确結果。

Encoding.java

java字元串編碼類型擷取

package org.loon.test.encoding;

java字元串編碼類型擷取
java字元串編碼類型擷取

/**

java字元串編碼類型擷取

 * <p>

java字元串編碼類型擷取

 * Title: LoonFramework

java字元串編碼類型擷取

 * </p>

java字元串編碼類型擷取
java字元串編碼類型擷取

 * De.ion:編碼基本類型集合

java字元串編碼類型擷取
java字元串編碼類型擷取
java字元串編碼類型擷取

 * Copyright: Copyright (c) 2008

java字元串編碼類型擷取
java字元串編碼類型擷取
java字元串編碼類型擷取

 * Company: LoonFramework

java字元串編碼類型擷取
java字元串編碼類型擷取
java字元串編碼類型擷取

 * License: http://www.apache.org/licenses/LICENSE-2.0

java字元串編碼類型擷取
java字元串編碼類型擷取

 * 

java字元串編碼類型擷取

 * @author chenpeng

java字元串編碼類型擷取

 * @email:[email protected]

java字元串編碼類型擷取

 * @version 0.1

java字元串編碼類型擷取

 */

java字元串編碼類型擷取

public class Encoding {

java字元串編碼類型擷取
java字元串編碼類型擷取

    // 支援的字元格式

java字元串編碼類型擷取

    public static int GB2312 = 0;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int GBK = 1;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int BIG5 = 2;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int UTF8 = 3;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int UNICODE = 4;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int EUC_KR = 5;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int SJIS = 6;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int EUC_JP = 7;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int ASCII = 8;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int UNKNOWN = 9;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public static int TOTALT = 10;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public final static int SIMP = 0;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public final static int TRAD = 1;

java字元串編碼類型擷取
java字元串編碼類型擷取

    // 解析名稱用

java字元串編碼類型擷取

    public static String[] javaname;

java字元串編碼類型擷取
java字元串編碼類型擷取

    // 編碼用

java字元串編碼類型擷取

    public static String[] nicename;

java字元串編碼類型擷取
java字元串編碼類型擷取

    // 應用于html中的字元集

java字元串編碼類型擷取

    public static String[] htmlname;

java字元串編碼類型擷取
java字元串編碼類型擷取

    public Encoding() {

java字元串編碼類型擷取

        javaname = new String[TOTALT];

java字元串編碼類型擷取

        nicename = new String[TOTALT];

java字元串編碼類型擷取

        htmlname = new String[TOTALT];

java字元串編碼類型擷取

        javaname[GB2312] = "GB2312";

java字元串編碼類型擷取

        javaname[GBK] = "GBK";

java字元串編碼類型擷取

        javaname[BIG5] = "BIG5";

java字元串編碼類型擷取

        javaname[UTF8] = "UTF8";

java字元串編碼類型擷取

        javaname[UNICODE] = "Unicode";

java字元串編碼類型擷取

        javaname[EUC_KR] = "EUC_KR";

java字元串編碼類型擷取

        javaname[SJIS] = "SJIS";

java字元串編碼類型擷取

        javaname[EUC_JP] = "EUC_JP";

java字元串編碼類型擷取

        javaname[ASCII] = "ASCII";

java字元串編碼類型擷取

        javaname[UNKNOWN] = "ISO8859_1";

java字元串編碼類型擷取
java字元串編碼類型擷取

        // 配置設定編碼名稱

java字元串編碼類型擷取

        htmlname[GB2312] = "GB2312";

java字元串編碼類型擷取

        htmlname[GBK] = "GBK";

java字元串編碼類型擷取

        htmlname[BIG5] = "BIG5";

java字元串編碼類型擷取

        htmlname[UTF8] = "UTF-8";

java字元串編碼類型擷取

        htmlname[UNICODE] = "UTF-16";

java字元串編碼類型擷取

        htmlname[EUC_KR] = "EUC-KR";

java字元串編碼類型擷取

        htmlname[SJIS] = "Shift_JIS";

java字元串編碼類型擷取

        htmlname[EUC_JP] = "EUC-JP";

java字元串編碼類型擷取

        htmlname[ASCII] = "ASCII";

java字元串編碼類型擷取

        htmlname[UNKNOWN] = "ISO8859-1";

java字元串編碼類型擷取
java字元串編碼類型擷取

        // 配置設定可讀名稱

java字元串編碼類型擷取

        nicename[GB2312] = "GB-2312";

java字元串編碼類型擷取

        nicename[GBK] = "GBK";

java字元串編碼類型擷取

        nicename[BIG5] = "Big5";

java字元串編碼類型擷取

        nicename[UTF8] = "UTF-8";

java字元串編碼類型擷取

        nicename[UNICODE] = "Unicode";

java字元串編碼類型擷取

        nicename[EUC_KR] = "EUC-KR";

java字元串編碼類型擷取

        nicename[SJIS] = "Shift-JIS";

java字元串編碼類型擷取

        nicename[EUC_JP] = "EUC-JP";

java字元串編碼類型擷取

        nicename[ASCII] = "ASCII";

java字元串編碼類型擷取

        nicename[UNKNOWN] = "UNKNOWN";

java字元串編碼類型擷取
java字元串編碼類型擷取

    }

java字元串編碼類型擷取
java字元串編碼類型擷取

    public String toEncoding(final int type) {

java字元串編碼類型擷取

        return (javaname[type] + "," + nicename[type] + "," + htmlname[type])

java字元串編碼類型擷取

                .intern();

java字元串編碼類型擷取
java字元串編碼類型擷取
java字元串編碼類型擷取
java字元串編碼類型擷取

}

java字元串編碼類型擷取

Encode,java(省略,見源碼)

本文轉自 cping 51CTO部落格,原文連結:http://blog.51cto.com/cping1982/129912