1. 程式人生 > >字元與位元組有什麼區別

字元與位元組有什麼區別

(一)“位元組”的定義

位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位。

(二)“字元”的定義

字元是指計算機中使用的文字和符號,比如1、2、3、A、B、C、~!·#¥%……—*()——+、等等。

(三)“位元組”與“字元”

它們完全不是一個位面的概念,所以兩者之間沒有“區別”這個說法。不同編碼裡,字元和位元組的對應關係不同:

①ASCII碼中,一個英文字母(不分大小寫)佔一個位元組的空間,一箇中文漢字佔兩個位元組的空間。一個二進位制數字序列,在計算機中作為一個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。

②UTF-8編碼中,一個英文字元等於一個位元組,一箇中文(含繁體)等於三個位元組。

③Unicode編碼中,一個英文等於兩個位元組,一箇中文(含繁體)等於兩個位元組。

符號:英文標點佔一個位元組,中文標點佔兩個位元組。舉例:英文句號“.”佔1個位元組的大小,中文句號“。”佔2個位元組的大小。

④UTF-16編碼中,一個英文字母字元或一個漢字字元儲存都需要2個位元組(Unicode擴充套件區的一些漢字儲存需要4個位元組)。

⑤UTF-32編碼中,世界上任何字元的儲存都需要4個位元組

摘評論:針對UTF-8,中國的漢字多達10多萬,常用的漢字3500左右[08年統計],如果用3個位元組來表示,一共只有2^16(65535)種可能,不足以表示10多萬的漢字。所以中日韓的超大字符集是採用的4個位元組來表示的,多達6萬多個。但是平時使用超大字符集的概率0.01%都不到。所以我們一般認為日常的中文在UTF-8中佔三個位元組,但實際上也有4個位元組的。

------------------------------------------------------------------------------------------------------------------------

1:char“字元”,byte“位元組”,bit“位”;

2:1 byte = 8 bit;

3:char 在Java中是2個位元組。java採用unicode,2個位元組(16位)來表示一個字元。

public class Test {

	public static void main(String[] args) {
		String str = "帥";
		char x = '帥';
		byte[] bytes1 = null;
		byte[] bytes2 = null;
		try {
			//utf-8 編碼
			bytes1 = str.getBytes("utf-8");
			//unicode編碼
			bytes2 = charToByte(x);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println("bytes1大小:" + bytes1.length);
		System.out.println("bytes2大小:" + bytes2.length);
	}

	public static byte[] charToByte(char c) {
		byte[] b = new byte[2];
		b[0] = (byte) ((c & 0xFF00) >> 8);
		b[1] = (byte) (c & 0xFF);
		return b;
	}
}

bytes1大小:3
bytes2大小:2

java是用unicode來表示字元,“帥”這個中文字元的unicode就是2個位元組。

String.getBytes(encoding)方法是獲取指定編碼的byte陣列表示,

通常gbk/gb2312是2個位元組,utf-8是3個位元組。

如果不指定encoding則取系統預設的encoding。

------------------------------------------------------------------------------------------------------------------------

十六進位制數

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

(A,B,C,D,E,F 對應 10,11,12,13,14,15)

計數到F後,再增加1個,就進位。

十六進位制數是計算機常用的一種計數方法,它可以彌補二進位制數書寫位數過長的不足,也用於電視機中。

十六進位制數的表示方式為0x開頭。

示例:0x6AF = 1711;從右向左開始計算,第一個字元數乘以16的零次方,加上第二個字元數乘以16的一次方,再加上第三個字元數乘以16的二次方。以此類推。

15 * 1 + 10 * 16 + 6 * 256 = 1711