面試官問你編碼相關的面試題,把這篇甩給他就完事!

前情回顧:Java中一個字符佔兩字節 但爲什麼new String("字").getBytes().length 返回3個字節

今天主要聊一聊:

  • 字節
  • 字符
  • 字符集
  • 編碼
  • 字符編碼
  • Java 內碼和外碼
  • Unicode

字節

例如 :00001111 這個8位二進制數就佔了一個字節的存儲容量。

字節(英語:Byte),通常用作計算機信息計量單位,不分數據類型。 一個字節代表八個比特(英語:Bit)。這個是最基本的概念了,字節是計算存儲容量的一種計量單位,計算機只能識別1和0組成的二進制位。一個數就是1位(bit),爲了方便計算,我們規定8位就是一個字節。

例如 :00001111 這個8位二進制數就佔了一個字節的存儲容量。

字符

字符和字節不太一樣,任何一個文字或符號都是一個字符,但所佔字節不一定,不同的編碼導致一個字符所佔的內存不同。字符是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。 也就是說,一個數字是一個字符,一個文字是一個字符,一個標點符號也是一個字符。

1 是 字符,“漢” 是字符,“!”感嘆號是字符。

字符集

  charset 是 character set 的簡寫,即字符集。字符的集合就叫字符集。ASCII字符集就是下表中的字符那一列的所有字符的集合

編碼

編碼是一個非常寬泛的概念!雖然我們一直用編碼特指字符集編碼,但這只是一種狹義的理解,廣義的理解則有很多:

  • 文字是對聲音的編碼
  • 照相機,攝像機把光信號編碼成圖像及視頻
  • 我們還經常能看到條形碼,二維碼,這些都是編碼

著名的摩爾斯電碼其實也是一種編碼:

image

在圖片中,M的編碼就是“━ ━”,其它類似。

字符編碼 是 編碼的一種情況,不過我們學計算機的說到編碼就是字符編碼。

字符編碼

encoding 是 charset encoding 的簡寫,即字符集編碼,簡稱編碼。定義字符集中的字符如何編碼爲特定的二進制數,以便在計算機中存儲(就是將字符在字符集中的對應位置化爲二進制)。

字符集和字符編碼一般一 一對應,Unicode字符集例外,因爲Unicode字符集有三種編碼方式(utf-8,utf-16,utf-32)

字符編碼 和 字符集的區別

與接口及接口實現的對比

可以把這兩者與接口接口實現做個對比:

image.png

從這裏可以很清楚地看到,

  1. 編碼是依賴於字符集的,就像代碼中的接口實現依賴於接口一樣;
  2. 一個字符集可以有多個編碼實現,就像一個接口可以有多個實現類一樣。

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編碼方案(這裏就是舉個例子,可能大牛就是搞出來玩,具體原因無從考究)

淺談Unicode

參考

本文首發於微信公衆號:程序員喬戈裏

如果是頭條用戶,可以在我的頭條號程序員喬戈裏後臺回覆 資源獲取價值59998元的編程和考研資料 覺得文章不錯的歡迎關注我的WX公衆號:程序員喬戈裏
我是BAT大廠後臺開發工程師,,專注分享技術乾貨/編程資源/求職面試/成長感悟等,關注送5000G編程資源和自己整理的一份幫助不少人拿下java的offer的面經附答案,免費下載CSDN資源。

原文出處:https://www.cnblogs.com/qiaogeli/p/12046731.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章