编程(1)-字符编码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxw136511485/article/details/78251843

    在实际编码中,总是会遇字符编码的问题!例如,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










阅读更多

没有更多推荐了,返回首页