1. 程式人生 > 實用技巧 >java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.ja

java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.ja

編碼

為什麼要編碼?

◎ 在 計 算 機 中 存 儲 信 息 的 最 小 單 元 是 1 個 字 節 , 即 8 個 bit, 所 以 能 表 示 的 字 符 範圍是0〜255個。

◎ 人類要表示的符號太多,無法用1個位元組來完全表示。
◎人類不同國家使用不同語言,需要被翻譯。

編碼的本質

計算機使用bit進行處理,編碼就是多少個bit表示一個符號,然後對bit進行分割翻譯。
如ASCII碼用一個byte表示一個符號,那麼ASCII編碼的處理方式就是把資料用8個bit分割成很多個塊,然後對每個塊進行翻譯。

不同的編碼方式對多大的位長表示一個符號有區別。

編碼格式

常 見 的 有 ASCII、 ISO-8859-1、 GB2312、 GBK、 UTF-8、 UTF-16 等

1、ASCII碼用一個byte表示一個符號,只有128個表示,部分數字對應關係如下:
        65 : A
        66 : B
        67 : C
        68 : D
		。。。。。
        91 : [
        92 : \
        93 : ]
        94 : ^
        95 : _
        96 : `
        97 : a
        98 : b
2、GB系列用於漢字編碼,兩個位元組表示一個漢字。

3、UTF系列和Unicode有關,iso組織試圖用於統一編碼格式,現有UTF-16和UTF-8常用。
	UTF-16用兩個位元組表示一個符號,定長(隨著unicode中字元的增加,2個位元組無法表示所有的字元,UTF16採用了2位元組或4位元組的方式來完成編碼)。
	UTF-8使用1-6個位元組表示符號,不定長。

Java中的編碼方式

char x='o';
char y='車';//char兩個位元組,可以儲存一個漢字

System.out.println((byte)('a')); //97
System.out.println((int) ('b')); //98




/*
//jvm使用UTF-16進行編碼,UTF16採用了2位元組或4位元組的方式來完成編碼。Java為應對這種情況,考慮到向前相容的要求,
Java用一對char來表示那些需要4位元組的字元。所以,java中的char是佔用兩個位元組,只不過有些字元需要兩個char來表示。
 */
        for(int i=1;i<=100000;i++){
            System.out.println(i+" : "+(char)(i));
        }

        //選擇編碼方式來讓機器選擇將位元組流(二進位制)多少個位作為一個單位,然後轉換成字元


        char c='紽'; //一個char能表示65536個符號,這個漢字在這個範圍內
        System.out.println((byte)(c)); //61 一個byte無法表示這個漢字,錯誤
        System.out.println((int)(c));   //32061
        System.out.println((long)(c));//32061

        /*
        是隨著unicode中字元的增加,2個位元組無法表示所有的字元,UTF16採用了2位元組或4位元組的方式來完成編碼。
        Java為應對這種情況,考慮到向前相容的要求,Java用一對char來表示那些需要4位元組的字元。
        所以,java中的char是佔用兩個位元組,只不過有些字元需要兩個char來表示。
         */
        char d='礦';//96255,這個漢字用一個char或者2個char儲存,保持相容,所以兩個值都可以
        System.out.println((char)(96255));//礦
        System.out.println((int)(d));   //30719
        System.out.println((long)(d));//30719
        System.out.println((char)(30719));//礦

        /*
        Java的class檔案採用UTF8來儲存字元,也就是說,class中字元佔1~6個位元組。
        Java序列化時,字元也採用UTF8編碼,佔1~6個字元。
        總結:
        1、java中內碼(執行記憶體)中的char使用UTF16的方式編碼,一個char佔用兩個位元組,但是某些字元需要兩個char來表示。所以,一個字元會佔用2個或4個位元組。
        2、java中外碼中char使用UTF8的方式編碼,一個字元佔用1~6個位元組。
        3、UTF16編碼中,英文字元佔兩個位元組;絕大多數漢字(尤其是常用漢字)佔用兩個位元組,個別漢字(在後期加入unicode編碼的漢字,一般是極少用到的生僻字)佔用四個位元組。
        4、UTF8編碼中,英文字元佔用一個位元組;絕大多數漢字佔用三個位元組,個別漢字佔用四個位元組。
         */