比特--字節--字符--編碼


比特

  • 計算機專業術語,是信息量單位,是由英文BIT音譯而來。
  • 二進制數系統中,每個0或1就是一個位(bit),位是數據存儲的最小單位。
  • 二進制數的一位所包含的信息就是一比特,如二進制數0100就是4比特。
  • 計算機中的CPU位數指的是CPU一次能處理的最大位數。例如32位計算機的CPU一次最多能處理32位數據。
  • 比特就是 bit(可以簡寫為b),就是位,是數據存儲的最小單位。</br>
  • bit=位=比特

字節

  • 字節是現代計算機中連續的、固定數量的比特(二進制):八個比特為一字節
  • 英文Byte翻譯就是字節
  • 字節就是Byte(可以簡寫為B),一字節就等于(占)8比特,就等于(占)8位</br>
  • 1字節=8比特=8bit=8位

  • java中基本數據類型

類型|字節數|(二進位制)位數|最小|最大|默認|其他
--|--|--|--|--|--|--|--
byte|1|8|-128(-27)|127(27-1)|0|
short|2|16|-32768(-215)|32767(215-1)|0|
int|4|32|- 2,147,483,648(-231)|2,147,483,647(231 -1)|0|
long|8|64|-9,223,372,036,854,775,808(-2^63)|9,223,372,036,854,775,807 (2^63 -1)|0L|
float|4|32|||0.0f|
double|8|64|||0.0d|
boolean||1|||false|
char|2|16||||


字符與編碼

  • ASCII碼
    字符編碼,統一規定了英語字符與二進制位之間的關系。
    ASCII碼一共規定了128個字符的編碼,比如空格"SPACE"是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節的后面7位,最前面的1位統一規定為0。
  • Unicode
    Unicode涵蓋了各個國家語言可能出現的符號和文字,并將為他們編號,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字"嚴"。
    Unicode只是一個編碼字符集。
    Unicode只規定了符號的二進制代碼,卻沒有規定這個二進制代碼應該如何存儲。

字庫表(character repertoire):一個相當于所有可讀或者可顯示字符的數據庫,決定了整個字符集能夠展現表示的所有字符的范圍。
編碼字符集(coded character set):用一個編碼值code point來表示一個字符在字庫中的位置。
字符編碼(character encoding form):編碼字符集和實際存儲數值之間的轉換關系。

Unicode是一個簡單的標準,用來把字符映射到數字上(可以這樣理解:選取一個具體的數字范圍,然后將范圍中的數字設置定義為碼位,然后為每個碼位編制一個文字符號,這樣文字符號就和數字建立了一一對應的關系。Unicode就是制定了這樣一種關系。而UTF-8實現,是指怎樣將這個碼位存儲起來,是1個字節還是2個字節,還是多個字節)。Unicode協會的人會幫你處理所有幕后的問題,包括為新字符指定編碼。Unicode并不告訴你字符是怎么編碼成字節的。這是被編碼方案決定的,通過UTF來指定。

  • UTF-8
    UTF-8是一種字符編碼,是Unicode規則字庫的一種實現形式(從UTF-8的全稱8-bit Unicode Transformation Format可以輔助理解這一點,utf-16,utf-32都是Unicode規則字庫的一種實現形式)。
    Unicode的編號從0000開始一直到10FFFF共分為17個Plane(016),每個Plane中有65536個字符。而UTF-8則只實現了第一個Plane,可見UTF-8雖然是一個當今接受度最廣的字符集編碼,但是它并沒有涵蓋整個Unicode的字庫,這也造成了它在某些場景下對于特殊字符的處理困難~
  • UTF-8編碼為變長編碼。最小編碼單位(code unit)為一個字節。一個字節的前1-3個bit為描述性部分,后面為實際序號部分。它可以使用1~6個字節表示一個符號(這句話可以參考維基百科的說明來理解),根據不同的符號而變化字節長度。
  • 對一個英文字母,在UTF-8編碼方式下占用1個字節
  • 對一個數字,在UTF-8編碼方式下占用1個字節
  • 對一個漢字而言,在UTF-8編碼方式下2-4個字節(沒有找到標準解答,一般為3到4個字節)
  • ISO-8859-1
    共能表示 256 個字符,占用1個字節
  • GB2312和GBK
    GB2312全稱是《信息交換用漢字編碼字符集 基本集》,總的編碼范圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。GBK全稱叫《漢字內碼擴展規范》,是國家技術監督局為 windows95 所制定的新的漢字內碼規范,它的出現是為了擴展 GB2312,加入更多的漢字,它的編碼范圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字,它的編碼是和 GB2312 兼容的,也就是說用 GB2312 編碼的漢字可以用 GBK 來解碼,并且不會有亂碼。
    對GB2312和GBK而言:
  • 對一個英文字母或者一個數字,占用1個字節
  • 對一個漢字而言,占用2個字節

為什么只會出現漢字亂碼,英文字母和數字卻不會:ASCII最先使用,其它的字符集都兼容ASCII

  • 內碼和外碼
    內碼(internal encoding):程序內部使用的字符編碼,特別是某種語言實現其char或String類型在內存里用的內部編碼;
    外碼(external encoding):程序與外部交互時外部使用的字符編碼。“外部”相對“內部”而言;不是char或String在內存里用的內部編碼的地方都可以認為是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行參數之類的。
    這里可以參考Java 字符串編碼

更多參考

字符集和字符編碼
編碼研究筆記
學點編碼知識又不會死:Unicode的流言終結者和編碼大揭秘
十分鐘搞清字符集和字符編碼
UTF-8
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
程序員趣味讀物:談談Unicode編碼
字符集編碼與亂碼文集

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 0 前言 在平時的開發過程中大部分人應該都遇到過中文亂碼問題,瀏覽網頁時也會遇到內容顯示亂碼的情況,一般遇到這種情...
    小豬啊嗚閱讀 2,650評論 1 10
  • 原文在這里:各種字符集和編碼詳解 在軟件的編碼和實現中,我們可能會碰到個 一個比較頭疼的問題--編碼,不同字符間的...
    舌尖上的大胖閱讀 1,837評論 0 2
  • 我不是他,沒有從開始就陪在你身邊,從不奢望,從不抱怨。 但我知道這個世界上有許多種等待,最好的那一種叫作來日可期...
    華百城閱讀 647評論 0 1
  • 美國著名心理學家賽利格曼提出了一個幸福的公式:總幸福指數=先天的遺傳素質+后天的環境+你能主動控制的心理力量 (H...
    半桶水命理探原閱讀 377評論 0 1
  • 我不太喜歡聚會。當然,如果有好朋友我就會很享受。今天就參加了一個聚會,有些後悔,因為這個聚會我浪費了去沃爾瑪找臂包...
    貓晨lenka閱讀 119評論 0 0