編程(1)-字符編碼

    在實際編碼中,總是會遇字符編碼的問題!例如,ASCII碼、BCD碼、BINARY、HEX、字符等類型!對於這些編碼類型,每次遇到都要查找好多資料,才能大致明白它們的意思以及如何使用!所以,今天就來好好整理下這方面的問題!

一、ASCII碼。

    簡單來說,ASCII是一套規範,它制定了我們常用字符與二進制數之間的對照關係!ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制爲0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。先來看幾張ASCII碼錶的截圖,(下面的截圖來自百度百科)



可以看到,該表 規定了 我們常見字符用什麼二進制數字表示!例如 數字0,它對應的二進制是00110000,八進制表示060,十進制表示48,十六進制表示0x30。(注意:八進制和十六進制的前綴數字0,而不是字母O)

下面以Java爲例,演示下同一字符轉化爲不同進制的ASCII碼值。

(1). 一個字符轉化爲ASCII碼,有兩種方式,將字符轉化爲 byte 或者 int。下面是例子代碼

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char a='0';
		byte b=(byte)a;
		int c=a;
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
	}

}

運行截圖


根據結果可以看到,字符0,它的ASCII碼值是48(十進制的),那麼它對應的八進制或者十六進制是多少呢?

(2).如何將整數轉爲八進制或者十六進制呢?

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		char a='0';
		byte b=(byte)a;
		int c=a;
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(Integer.toHexString(c));
		System.out.println(Integer.toOctalString(c));
	}

}
運行截圖下圖所示,


字符0,對應的十進制的ASCII碼值是48,對應的八進制的ASCII碼值是60(060),對應的十六進制的ASCII碼值是30(0x30)。

例子代碼中,將整數轉爲八進制或者十六進制,使用的是JDK包中Integer類提供的現成方法。當然,我們也可以自己去實現各個進制轉換的方法。

小結

      當我們在使用某字符的ASCII碼時,需要知道該字符在ASCII碼錶中對應的ASCII碼值是多少?它的八進制、十進制、十六進制各是多少?知道這幾個問題的答案,就可以了!


二、二進制。

    我們在實際工作和生活中,接觸頻率比較高的應該就是二進制了!相信各位對二進制或多或少都有概念!

    二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是“逢二進一”,借位規則是“借一當二”,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。計算機中的二進制則是一個非常微小的開關,用“開”來表示1,“關”來表示0。(來自百度百科)

    二進制數表示法,

    二進制數據也是採用位置計數法,其位權是以2爲底的冪。例如二進制數據110.11,逢2進1,其權的大小順序爲2²、2¹、2º、 、  。對於有n位整數,m位小數的二進制數據用加權係數展開式表示,可寫爲:

二進制數據一般可寫爲:
 

    下面看一個二進制數,

     1011,它代表的十進制數是11, 

     有關進制之間的轉換,本文就不細說了!

三、十六進制。

    十六進制,和二進制類似,它是由0-9,A-F組成,逢16進1。

    十六進制數表示法,

    十六進制照樣採用位置計數法,位權是16爲底的冪。對於n位整數,m位小數的十六進制數用加權係數的形式表示

    下面看一個十六進制數,

     0x20,它代表的十進制數是32, 2×16¹+0×16º=32  

    有關進制之間的轉換,本文就不細說了!
四、BCD碼
    首先,我們需要有一個概念!BCD碼錶示的是一種十進制數!


    BCD碼(Binary-Coded Decimal‎)是二進制編碼的十進制數的縮寫,BCD碼用4位二進制數表示一位十進制數。BCD碼各位的數值範圍爲2#0000~2#1001,對應於十進制數0~9。BCD碼不能使用十六進制的A~F(2#1010~2#1111)這6個數字。BCD碼本質上是十進制數,因此相鄰兩位逢十進一。
   BCD碼的最高位二進制數是符號位,負數的符號位爲1,正數爲0。16位BCD碼的範圍爲–999~+999。

    BCD碼分類

    BCD碼可分爲有權碼和無權碼兩類:有權BCD碼有8421碼、2421碼、5421碼,其中8421碼是最常用的;無權BCD碼有餘3碼,餘3循環碼等。

8421 BCD碼是最基本和最常用的BCD碼,它和四位自然二進制碼相似,各位的權值爲8、4、2、1,故稱爲有權BCD碼。和四位自然二進制碼不同的是,它只選用了四位二進制碼中前10組代碼,即用0000~1001分別代表它所對應的十進制數,餘下的六組代碼不用。

5421和2421
5421 BCD碼和2421 BCD碼爲有權BCD碼,它們從高位到低位的權值分別爲5、4、2、1和2、4、2、1。這兩種有權BCD碼中,有的十進制數碼存在兩種加權方法,例如,5421 BCD碼中的數碼5,既可以用1000表示,也可以用0101表示;2421 BCD碼中的數碼6,既可以用1100表示, 也可以用0110表示。這說明5421 BCD碼和2421 BCD碼的編碼方案都不是惟一的,表1-2只列出了一種編碼方案。
上表中2421 BCD碼的10個數碼中,0和9、1和8、2和7、3和6、4和5的代碼對應位恰好一個是0時,另一個就是1。就稱0和9、1和8互爲反碼。
餘3 碼
餘3碼是8421 BCD碼的每個碼組加3(0011)形成的。常用於BCD碼的運算電路中。


PS:  壓縮BCD碼與非壓縮BCD碼的區別—— 壓縮BCD碼的每一位用4位二進制表示,一個字節表示兩位十進制數。例如10010110B表示十進制數96D;非壓縮BCD碼用1個字節表示一位十進制數,高四位總是0000,低4位的0000~1001表示0~9.例如00001000B表示十進制數8。

五、字符。

    字符是指計算機中使用的字母、數字、字和符號,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在 ASCII 編碼中,一個英文字母字符存儲需要1個字節。在 GB 2312 編碼或 GBK 編碼中,一個漢字字符存儲需要2個字節。在UTF-8編碼中,一個英文字母字符存儲需要1個字節,一個漢字字符儲存需要3到4個字節。在UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(Unicode擴展區的一些漢字存儲需要4個字節)。在UTF-32編碼中,世界上任何字符的存儲都需要4個字節。(有關GBK 、Unicode、UTF-8、UTF-16、UTF-32可以看末尾的推薦文章)


六、小結

    (a).各種編碼,其實是定義了字符和數字之間的對應關係,這種規則是一張表。

    (b).編碼出現的次序,ASCII編碼-->ISO編碼-->GBK編碼-->unicode編碼(uft-8,utf-16,utf-32編碼方案)



    推薦幾篇有關編碼的文章

    Unicode(UTF-8, UTF-16)令人混淆的概念

    utf-8和Unicode的區別

    UNICODE,GBK,UTF-8區別

   http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html










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