比特
- 計算機專業術語,是信息量單位,是由英文
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編碼
字符集編碼與亂碼文集