Java 字元編碼與解碼

2021-08-21 13:01:35 字數 3159 閱讀 9689

1、字元編碼的發展歷程

①、ascii 碼

因為計算機只認識數字,所以我們在計算機裡面的一切資料都是以數字來表示,因為英文本元有限,所以規定使用的位元組的最高位是 0,每乙個位元組都是以 0-127 之間的數字來表示。比如 a 對應 65,a 對應 97。這便是 美國標準資訊交換碼,ascii

string str = new string("aa");

byte strascii = str.getbytes("ascii");

system.out.println(arrays.tostring(strascii));//[65, 97]

②、gb2312 碼

隨著計算機在全球的普及,很多國家和地區都把自己的字元引入了計算機,比如漢字。此時發現乙個位元組能表示的數字範圍太小,不能包含所有的中文漢字。那麼就規定使用兩個位元組來表示乙個漢字。

規定:原有的 ascii 字元的編碼保持不變,仍然使用乙個位元組表示,為了區別乙個中文字元與兩個 ascii 碼字元相區別。中文字元的每個位元組最高位規定為 1(即中文的二進位制是負數),這便是 gb2312 編碼

string str = new string("aa帥鍋");

byte strascii = str.getbytes("gb2312");

system.out.println(arrays.tostring(strascii));//[65, 97, -53, -89, -71, -8]

③、gbk

由於中國漢字太多,在 gb2312 的基礎上增加了更多的中文字元,這種編碼是 gbk

解決辦法:為了解決各個國家因為本地化字元編碼帶來的影響,就把全世界所有的字元統一進行編碼---unicode 編碼

此時某乙個字元在全世界任何地方顯示都是固定的,比如漢字 哥,在任何地方都是以十六進製制 54e5 來表示。

unicode 的字元編碼都占有兩個位元組

④、utf-8

是一種針對 unicode 的可變長度字元編碼,又稱為 萬國碼,是 unicode 的實現方式之一。編碼中的第乙個位元組仍與 ascii 相容,這使得原來處理 ascii 字元的軟體無須或只需做少部分修改,即可繼續使用。因此,它逐漸成為電子郵件、網頁及其他儲存或傳送文字的應用中,優先採用的編碼。網際網路工程工作小組(ietf)要求所有網際網路協議都必須支援 utf-8 編碼

string str = new string("aa帥鍋");

byte strascii = str.getbytes("utf-8");

system.out.println(arrays.tostring(strascii));//[65, 97, -27, -72, -123, -23, -108, -123]

儲存字母、數字:無論什麼字符集都占有 1 個位元組

儲存漢字:gbk 家族占有 2 個位元組。utf-8 占有 3 個位元組

不能使用單位元組的字符集(ascii/iso-8859-1)來儲存中文

2、字元的編碼和解碼

資訊在計算機網路中傳輸是以位元組的形式。那麼如何變為位元組?這就是編碼的過程。那麼計算機接收了這個編碼,如何讓使用者認識呢?那必須要將位元組轉換為人所識別的字串形式,這就是解碼的過程。

編碼:將字串轉換為 byte 陣列

解碼:把 byte 陣列轉換為 字串

注意:①、編碼格式和解碼格式必須一致,否則亂碼

string str = new string("aa帥鍋");

//編碼操作

byte strbyte = str.getbytes("gbk");

system.out.println(arrays.tostring(strbyte));//[65, 97, -53, -89, -71, -8]

//解碼操作

//注意編碼的字符集和解碼的字符集格式必須一致(是其擴充套件字符集也可以),否則會亂碼

//第一種:編碼格式為 gbk,解碼格式為 iso-8859-1 那麼就會亂碼

string str2 = new string(strbyte,"iso-8859-1");

system.out.println(str2); //aa?§??

//第二種:編碼和解碼格式一致

string str3 = new string(strbyte,"gbk");

system.out.println(str3); //aa帥鍋

②、有時候編碼為和解碼格式一致了,但是還是亂碼,這是因為在資料在傳輸過程中經過伺服器的處理,而這個伺服器可能是外國人編寫的,那麼就會將資料轉換為 別的字元格式,那麼你如果還是直接轉為自己想要的格式是會亂碼的。

解決辦法:先獲取經過伺服器之後的資料還原編碼,然後在進行解碼

string str = new string("aa帥鍋");

//編碼操作

byte strbyte = str.getbytes("utf-8");

system.out.println(arrays.tostring(strbyte));//[65, 97, -27, -72, -123, -23, -108, -123]

//中間經過了伺服器的傳輸,編碼格式轉成了 iso-8859-1

string str2 = new string(strbyte,"iso-8859-1");

//解碼操作 ,此時如果直接進行解碼,那麼會亂碼

string str3 = new string(str2.getbytes(),"utf-8");

system.out.println(str3); //aa???????

//對於上面的亂碼,我們必須先還原伺服器之前的編碼格式,然後在進行解碼。那麼就不會亂碼

byte strbyte2 = str2.getbytes("iso-8859-1");

string str4 = new string(strbyte2,"utf-8");

system.out.println(str4); //aa帥鍋

字元編碼與解碼

ascii碼 英文本母 數字 特殊字元 擴充套件ascii碼 ascii碼的擴充套件,增加了拉丁文 gb2312 對ascii的中文擴充套件。簡體中文的字符集編碼。包含7000多漢字 gb18030和gbk gbk是對gb2312的擴充套件,包括了gb2312所有內容,增加近2萬漢字和符號 unic...

Java 字符集,編碼 解碼

1 計算機中檔案 資料底層都是基於二進位制的。字符集 包含著字元和二進位制序列之間的對應關係,乙個字元對應乙個二進位制序列。編碼 encode 把人能看懂的明文轉換為計算機能理解二進位制序列。解碼 decode 把計算機中的二進位制序列轉換為人能看懂的明文。亂碼 解碼方式與編碼方式不同,即編碼 解碼...

字元的編碼與解碼

ascii碼 7bit表示乙個字元,共計128個字元 iso 8859 1 8bit表示乙個字元,乙個位元組 byte 表示乙個字元,共計256個字元 gb2312 簡體中文的國標碼,2個位元組表示乙個漢字,包含常見中文 gbk 擴充套件了gb2312 gb18030 中文最全的 big5 正體中文...