編碼和解碼

Java 中的編碼
 
談到編碼,一直都很模糊這個概念。
首先明確3個對象: 字符集合(),字符集合的 編碼(),字符集合的 編碼 的編碼方案()
 
 
定義
結合java
注意
 
字符集合
一組各類形狀的集合,相似倉頡造的字,沒有實際含義,只是一個有獨一無二的形狀。就像牢房裏面的囚犯,每一個人都是獨一無二的。
 
計算機要顯示文字圖案,對於全部顯示的文字圖案,均可以看作一個字符。
字符集合是基於操做系統的,有個相似字符庫,來保存全部會出現的字符。這裏是指顯示,實際保存仍是一串二進制數。
沒啥注意的都是固定的。
 
字符集合的 編碼
上面的每一個形狀,給他一個惟一標識,一對一的關係,就像每一個囚犯都有惟一的一個編號。
有不少規則,規定每一個字符對應什麼數字。咱們熟知的有Assis碼,中國的規則有gb2312 ,統一的是 unicode ,java內部用的是 unicode。例如‘A’,Assis碼中用65表示。
 
最先只有127個字母被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼。一個字節。
,unicode 通常佔兩個字節。
java 中 定義的char類型字符,就是佔兩個字節。
 
變量在java程序中,咱們定義的基本類型,char 就只用2個字節存儲。
 
字符集合的 編碼 的 編碼方案
再對上面的惟一標識作一次處理,定義一個規則,每一個數字按照規則,轉換成一個新的標識。每一個監獄勞動改造的規則不同,有的監獄,超過60歲少作點,有的超過70歲少作點
要把上面規定好的 字符的編碼 存儲到計算機中,也就是以2進制保存起來,
例如
上面的A字符對應  字符的編碼 65 ,二進制就是  0 100 0001,用8位保存到計算機磁盤中。
我這裏只作了簡單的轉換,實際上,人們制定了不少規則,將 字符的編碼  65 轉換成 1-n個字節保存。
規則有定長的:每一個字符的編碼用統一長度字節保存,好比都用3個字節保存。
不定長的:典型的就是utf-8,用 1-6個字節,英文字母1個字節,漢字3個字節,生僻字4-6個字節。
數據持久化,保存到磁盤中,都是字節爲基本單位。
 
按照編碼方案,將程序中的 字符的編碼 轉換成 可以存儲到本地的 字節數組 這個狀況叫作編碼。
 
相反 ,咱們從磁盤或者其餘路徑獲得一個字節數組,按照編碼方案,將其轉換成 一個數字,也就是字符的編碼,這個過程叫作解碼。
 
 
編碼解碼過程
 
 
步驟
1
2
3
4
編碼
字符,java中顯示 
 
 
字符集合的 編碼,  unicode查找 java中實際存儲
 
 
230013
字符集合的 編碼 的編碼方案 用utf-8
java中的方法 :將 字符集合的編碼 一個數值轉化 成一個字節數組
byte[] bytes = String.valueOf(c2).getBytes("utf-8");
{-28,-72,-83}
 
 
解碼
一個字節數組{-28,-72,-83}
字符集合的 編碼 的編碼方案 
用gbk解碼,就是把這個字節數組按照gbk的方式
獲得一個 xxxx 數字(在這裏我不知道)
根據xxxx,經過unicode查找 顯示的
java中,將 字節數組 轉換 成一個數值String a = new String(bytes,"gbk")
 
這裏注意我用的是一個 String接受,String 能夠轉化成char[]
這每一個字符其實,在java中就是一個數字,就像230013同樣。
因爲編碼和解碼方式不同 就致使了亂碼
 
 
 
參考:
相關文章
相關標籤/搜索