在實際編碼中,總是會遇字符編碼的問題!例如,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。
十六進制數表示法,
下面看一個十六進制數,
0x20,它代表的十進制數是32, 2×16¹+0×16º=32
有關進制之間的轉換,本文就不細說了! 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編碼方案)
推薦幾篇有關編碼的文章
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html