字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)
文章目錄
- 常見字符集 (ASCII、GBK、UTF-8、編碼方案,解碼方案、亂碼等問題)
- 1.ASCII編碼
- 2.GBK編碼(漢子內碼擴展規范,國標)
- 3.UTF-8編碼
- Unicode字符集(統一碼,也加萬國碼)
- UTF-8編碼方式
- 4.java代碼實現字符的編、解碼
- 編碼
- 解碼
常見字符集 (ASCII、GBK、UTF-8、編碼方案,解碼方案、亂碼等問題)
1.ASCII編碼
-
當美國人發明計算機時,他們遇到了一個問題:要想讓計算機來處理數據,首先得讓計算機
能夠存儲美國人的文字,但是計算機是機器只能處理 0和1(二進制數) 兩種信號,為此美
國人設計出了一套能夠讓計算機存儲他們文字的編碼(ASCII編碼)。由于美國人的文字只
由數字(09)、26個字母(az,A~Z)、標點符號以及一些特殊字符組成,加起來總共127個字符,
于是美國人就給這127個字符進行編號:從0到127(0~127)。為了讓計算機能夠存儲,他們就將
每個編號轉換為對應二進制數,由于計算機存儲數據的基本單位是字節,而1字節用8位二進制數
表示,而7位二進制數就可以表示0到127所有的字符,于是美國人就在每個字符編碼前面加了一
位0,使其構成8位,至此美國人的文字在計算機中就用一位字節表示。 -
標準ASCII字符集
-
ASCII(American Standard Code for Information Interchange):美國信息交換標準代碼,包括了英文符號等。
-
標準ASCII使用1字節存儲一個字符,首位是0,總共可以表示128個字符,對美國佬來說完全夠用。
-
2.GBK編碼(漢子內碼擴展規范,國標)
-
隨著計算機的使用越來越廣泛,當中國人看到美國人的編碼(ASCII編碼)時,說了一句:還不夠我塞牙縫!
-
漢字編碼字符集,包含2萬多個漢字等字符,GBK中一個中文字符編碼成兩個字節的形式存儲。
-
注意:GBK兼容了ASCII字符集。(這里提一句:因為計算機是美國人發明的,你要使用,就要聽話,
遵守美國人制定的規則,所以需要兼容ASCII字符集) -
問題來了:如果英文數字用一個字節存儲,漢字用兩個字節存儲,那么當一段文字中既有漢字也有英文
時,計算機是怎樣識別的呢?- GBK規定:漢字的第一個字節的第一位必須是1。當計算機讀取字節的時候發現該字節的第一位是1
時,計算機就認為這是一個漢字,于是計算機就連讀取兩個字節來表示一個漢字,當計算機讀取字節
時發現第一位是0,計算機就認為這是一個ASCII的字符,于是計算機就只讀取一個字節來表示為ASCII
的字符。
- GBK規定:漢字的第一個字節的第一位必須是1。當計算機讀取字節的時候發現該字節的第一位是1
3.UTF-8編碼
- 當計算機在全世界普及時,如果每個國家都來一個編碼,比如:巴基斯坦碼、迪拜碼、島國碼、韓文碼、
烏茲別克斯坦碼、吉爾吉斯斯坦碼、哈薩克斯坦碼這么的編碼時,會出現現一個很嚴重的問題:信息在各個國
家流通的時候,比如:韓文碼用迪拜碼打開時肯定會出現一個亂碼的問題!這時,國際組織就站出來了,說:
你們都別整自己字符集了,我來給全世界國家整一套通用的字符集,叫Unicode字符集(統一碼,也加萬國碼)
Unicode字符集(統一碼,也加萬國碼)
-
Unicode是國際組織制定的,可以容納世界上所有文字、符號的字符集。
-
Unicod字符集提供了很多編碼方案,例如:UTF-32
-
UTF-32編碼方案的思想是:簡單粗暴,我用四個字節來存儲一個字符,有容乃大。
-
但是UTF-32并沒有被人們所接納,因為人們覺得這種編碼太 奢侈 了,美國人ASCII字符集本來一個字節
就可以存儲但是用UTF-32就需要用四個字節,空出來3個字節用不到還多要3倍的存儲空間,非常的浪費,就
是連中國人的漢字也沒占到便宜,有兩位字節用不到,還要多用1倍的存儲空間。而且這樣字符在通訊效率上
還會大大降低。 -
國際組織站出來看好像也是啊,于是國際組織又設計了一套改變字符蒼生的新的編碼方案:UTF-8
-
UTF-8編碼方式
- 是Unicode字符集的一種編碼方案嗎,采取可邊長方案,共分四個長度區:1字節,2字節,3字節,4字節
- 英文字符、數字等只占1個字節(兼容標準ASCI編碼),漢字字符占用3個字節。
| 0xxxxxxx (ASCII碼) | 1個字節:第一位為0 |
| 110xxxxx 10xxxxxx | 2個字節:第一個字節前3位為110,第二個字節前2位位10 |
| 1110xxxx 10xxxxxx 10xxxxxx | 3個字節:第一個字節前4位為1110,第2個字節和第3個字節前2位都位10 |
| 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4個字節:第一個字節前5位為11110,后3個字節每個字節前2位都為10 |
-
其余位才用來存儲具體的字符編碼,從右開始排列
-
注意:
- 技術人員在開發的時候都應該使用UTF-8編碼!
- 字符編碼時使用的字符集,和解碼時使用的字符集必須一致,否則會出現亂碼
- 英文,數字一般不會亂碼,因為很多字符集都兼容了ASCII編碼。
4.java代碼實現字符的編、解碼
編碼
| byte[] getBytes() | 使用平臺的默認字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中 |
| byte[] getBytes(charsetName) | 使用指定字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中 |
解碼
| String(byte[] bytes) | 使用平臺的默認字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中 |
| String(byte[] bytes, String charsetName) | 使用指定字符集將該 String編碼為一系列字節,將結果存儲到新的字節數組中 |
總結
以上是生活随笔為你收集整理的字符集 (ASCII、GBK、UTF-8、编码方案,解码方案、乱码等问题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java gbk转机内码_\xd5\xd
- 下一篇: c语言的积木编程,c语言入门3,自己造积