前情回顧:Java中一個字符佔兩字節 但爲何new String("字").getBytes().length 返回3個字節html
今天主要聊一聊:java
例如 :00001111 這個8位二進制數就佔了一個字節的存儲容量。程序員
字節(英語:Byte),一般用做計算機信息計量單位,不分數據類型。 一個字節表明八個比特(英語:Bit)。這個是最基本的概念了,字節是計算存儲容量的一種計量單位,計算機只能識別1和0組成的二進制位。一個數就是1位(bit),爲了方便計算,咱們規定8位就是一個字節。面試
例如 :00001111 這個8位二進制數就佔了一個字節的存儲容量。編程
字符和字節不太同樣,任何一個文字或符號都是一個字符,但所佔字節不必定,不一樣的編碼致使一個字符所佔的內存不一樣。字符是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。 也就是說,一個數字是一個字符,一個文字是一個字符,一個標點符號也是一個字符。windows
1 是 字符,「漢」 是字符,「!」感嘆號是字符。微信
charset 是 character set 的簡寫,即字符集。字符的集合就叫字符集。ASCII字符集就是下表中的字符那一列的全部字符的集合。
jvm
編碼是一個很是寬泛的概念!雖然咱們一直用編碼特指字符集編碼,但這只是一種狹義的理解,廣義的理解則有不少:編碼
著名的摩爾斯電碼其實也是一種編碼:.net
在圖片中,M的編碼就是「━ ━」,其它相似。
字符編碼 是 編碼的一種狀況,不過咱們學計算機的說到編碼就是字符編碼。
encoding 是 charset encoding 的簡寫,即字符集編碼,簡稱編碼。定義字符集中的字符如何編碼爲特定的二進制數,以便在計算機中存儲(就是將字符在字符集中的對應位置化爲二進制)。
字符集和字符編碼通常一 一對應,Unicode字符集例外,由於Unicode字符集有三種編碼方式(utf-8,utf-16,utf-32)
能夠把這二者與接口及接口實現作個對比:
從這裏能夠很清楚地看到,
簡單來講
java內碼:unicode(utf-16)
jvm默認外碼:
人們弄出新的字符集標準,驅動力無外乎是舊的字符集裏的字符不夠用了。
Unicode 的目標是統一全部的字符集,囊括全部的字符,粗略估算爲 17×6萬=102 萬,因此字符集發展到它這裏就到頭了,再去整什麼新的字符集就不必也不該該了,102萬目前已經徹底夠用了。
但若是以爲它現有的編碼方案不太好呢?在不能弄出新的字符集狀況下,只能在編碼方面作文章了,因而就有了多個實現,這樣一來傳統的一一對應關係就打破了。
好比說UTF-32編碼,哪怕是00000000 00000000 00000000 00001111這種其實只佔了1個字節的字符,咱們也要爲他分配4個字節的空間,這就致使一個能夠用1G保存的文件,如今須要4G才能保存,這是極其浪費的作法。
因而某位大牛以爲UTF-32編碼太浪費空間了吧,因而大牛就作出了UTF-八、UTF-16編碼方案(這裏就是舉個例子,可能大牛就是搞出來玩,具體緣由無從考究)
本文首發於微信公衆號:程序員喬戈裏
若是是頭條用戶,能夠在個人頭條號程序員喬戈裏後臺回覆 資源獲取價值59998元的編程和考研資料
以爲文章不錯的歡迎關注個人WX公衆號:程序員喬戈裏
我是BAT大廠後臺開發工程師,,專一分享技術乾貨/編程資源/求職面試/成長感悟等,關注送5000G編程資源和本身整理的一份幫助很多人拿下java的offer的面經附答案,免費下載CSDN資源。