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