java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.ja
阿新 • • 發佈:2020-10-22
編碼
為什麼要編碼?
◎ 在 計 算 機 中 存 儲 信 息 的 最 小 單 元 是 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編碼中,英文字元佔用一個位元組;絕大多數漢字佔用三個位元組,個別漢字佔用四個位元組。 */