【java解惑】字符串的字節數組構造函數使用


    如下代碼:

public class Example018 {

	public static void main(String[] args) {
		byte bs[] = new byte[256];
		for (int i = 0; i < 256; i++) {
			bs[i] = (byte) i;
		}
		string(bs);// 調用1
		string(bs, "iso-8859-1");// 調用2
		string(bs, "gbk");// 調用3
		string(bs, "utf-8");// 調用4
	}

	static void string(byte[] bs) {
		String str = new String(bs); // 使用String(byte[])構造函數
		for (int i = 0, length = bs.length; i < length; i++) {
			System.out.print((int) str.charAt(i) + " ");
		}
	}

	static void string(byte[] bs, String charset) {
		try {
			String str = new String(bs, charset);// 使用String(byte[],charset)構造函數
			for (int i = 0, length = bs.length; i < length; i++) {
				System.out.print((int) str.charAt(i) + " ");
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}


    結果說明:

    在上述代碼中,除了調用2可以正確編譯並執行得到意料結果以外,其他的三個調用都不會正確執行。


    結果分析:

    上述代碼的四個調用都使用了字符串的字節數組構造函數。在API中,對這個構造函數的描述是:在通過解碼使用平臺缺省字符集的指定byte 數組來構造一個新的String 時,該新String 的長度是字符集的一個函數,因此,它可能不等於 byte 數組的長度。當給定的所有字節在缺省字符集中並非全部有效時,這個構造器的行爲是不確定的。

    ISO-8859-1 是唯一能夠讓上述程序按順序打印從0到255的整數的缺省字符集,它更爲大家所熟知的名字是Latin-1。


    事實+:

    字符集:被編碼的字符集合和字符編碼模式的結合物。換句話說,字符集是一個包,包含了字符、表示字符的數字編碼以及在字符編碼序列和字節序列之間來回轉換的方式。轉換模式在字符集之間存在着很大的區別:某些是在字符和字節之間做一對一的映射,但是大多數都不是這樣。 

  • ISO-8859-1最早的編碼,和ASCII編碼相似。屬於單字節編碼,最多能表示的字符範圍是0-255,應用於英文系列,無法表示中文。

  • GB2312/GBK:專門用來表示漢字,是雙字節編碼,而英文字母和ISO-8859-1一致(兼容ISO-8859-1編碼)。其中GBK編碼能夠用來同時表示繁體字和簡體字,而GB2312只能表示簡體字,GBK是兼容GB2312編碼的。 

  • UNICODE:最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,不兼容ISO-8859-1。

  • UTF:由於UNICODE編碼不兼容ISO-8859-1,而且容易佔用更多的空間,所以UNICODE不便於傳輸和存儲,因此而產生了UTF編碼,UTF編碼兼容ISO-8859-1編碼,同時也可以用來表示所有語言的字符。UTF編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,UTF編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。 



    參考資料:

  1、http://blog.csdn.net/xiongchao2011/article/details/7276834

  2、http://www.blogjava.net/thisliy/archive/2009/12/09/305313.html

  3、http://bbs.csdn.net/topics/350128607

 


(注:本【java解惑】系列,均是博主閱讀《java解惑》原書後,將原書上的講解和例子部分改編,然後寫成博文進行發佈的。所有例子均親自測試通過,並共享在github上。通過這些例子,激勵自己,惠及他人。同時,本系列所有博文會同步發佈在博主個人微信公衆號(搜索“愛題猿”或者“ape_it”),方便大家閱讀。如果文中有任何侵犯原作者權利的內容,請及時告知博主,以便及時刪除;如果讀者對文中的內容有異議或者問題,歡迎通過博客留言或者微信公衆號留言等方式共同探討。)

源代碼地址:https://github.com/rocwinger/java-disabuse


本文出自 “winger” 博客,謝絕轉載!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章