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

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


今天主要聊一聊:java

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

字節

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

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

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

字符

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

1 是 字符,「漢」 是字符,「!」感嘆號是字符。微信

字符集

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

編碼

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

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

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

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

淺談Unicode

參考

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

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

相關文章
相關標籤/搜索