1、概念
字符集
- 字符:字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。
- 字符集:一组抽象字符的集合就是字符集(Charset)。
- 举例说明字符集:ASCII字符集、Unicode字符集。
编码
- 编码:是一套法则,使用该法则能够对字符集(如字母表或音节表),与数字集合(如号码或电脉冲)进行配对。即在字符集与数字集合之间建立一一对应关系。例如:在ASCII字符集里面的一个字符 ‘A’,利用ASCII编码,我们就可以把字符‘A’编码成65(此处用十进制表示,在计算机里面是用二进制表示)。我们把这种对应关系‘A‘<------>65就称为编码
总结:字符集《===编码和反编码=====》二进制
2、提出问题
- 在语言方面,不同的国家和地区的字符集不一样。例如:美国的字符集就是ACSII字符集,而中国的字符集有ACSII字符集里面没有的字符,比如说汉字。如何解决这个问题?
- 我们要把字符集转化为二进制,就必须定义一些规则,这就是编码规则。建立一种一一对应关系的方式有很多种。如何统一一种编码规则?
3、解决问题
- 字符集不一样,我们提出以下两种方法来解决
- 定义多个字符集,比如说:美国就定义ASCII字符集,中国就定义GB2132字符集,阿拉伯又定义其他的字符集。
- 定义一个全世界通用的字符集,称为世界通用字符集,涵盖世界上所有的文字和符号。比如说:unicode字符集。
- 定义多个字符集这种方案的优劣点:优点:字符集所占的控件小,编码所需要的字节小,比如说:编码ASCII字符集只需要7bit就可以了,而编码unicode需要超过7bit。缺点:缺点是显而易见的,编码的字符集和解码的字符集必须一样。比如说:打开一个网页,这个网页是用ASCII字符集的,但是在中国假如用GB2132字符集去解码,得到的结果肯定不一样。通过这个例子我们可以得出,如果每个国家和地区都定义自己的字符集,在如此发达的互联网的今天,这将是灾难性的,因为我要访问那个网站的时候,必须要有相应的字符集和相应的解码规则才能获取正常的内容,才能正常的显示出来。
- 定义一个全世界通用的字符集方案的优劣点:优点:无需其它的字符集,全世界所有地区和国家都用这个字符集,不管什么地区的网页都用相同的编码和解码规则,这样非常利于文件的网络传输。缺点:字符集大,要比较多的存储,制定字符集的难度大(需要很多国家和地区的配合)。所幸的是,这些问题现在都比较好的解决了。
- 编码规则的建立,我们有以下方法(以unicode字符集为例)
- 用非常简单的方法,用32bit来编码字符集中的每一个字符,这样即使庞大的unicode字符集都能表示出来。
如果用32bit来编码所有的unicode字符集,那么排在字符集前面的字符将要浪费一些储存空间。比如说:‘A‘用65来编码(在ASCII字符集)转化成二进制为:1000001。如果是用32bit来编码,那要在它前面添加很多0直到补满32位。再比如说:中文字“好”,用两个字节来对它编码,假如是:1001100110011001,但是现在要填满32为,只能在前面填0,而所有的这些0在解码的时候都是要去掉的,是无意义的。因此这样用32bit来编码对储存空间的浪费是很显著的,尤其是网络传输,有很多流量是被浪费掉了。因此,我们提出一种变长度的编码方式,这就是非常有名的UTF-8编码。
4.UTF-8编码
编码规则:(以下是引用*的内容)
UCS-4编码 | UTF-8字节流 |
---|---|
U+00000000 – U+0000007F | 0xxxxxxx |
U+00000080 – U+000007FF | 110xxxxx 10xxxxxx |
U+00000800 – U+0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
U+00010000 – U+001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
U+00200000 – U+03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
U+04000000 – U+7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
百度一下:资料显示为:
UCS-2和UCS-4
Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,
这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。 而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。 顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。
为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。 它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。
要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。 规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
unicode字符集的ucs-2表,点击这里好,弄清了ucs-2和ucs-4,接下来我们就做一个例子。
第一步:确定编码对象,比如说:“好”,查找他的ucs-4,获取对应的值,点击这里查找,结果为:U+597D
第二部:对应上面的表(上面的表是ucs-4,这里我们查找的是ucs-2,但是ucs-4的前部分跟ucs-2是一样的),找到区间为第三排
第三部:把597D转化为二进制,为101100101111101,按照第三排的样式插入进去,从右往左插,不够就补0。结果为:11100101 10100101 10111101
第四部:检验结果的正确性,把11100101 10100101 10111101转化为16进制:E5A5BD
打开记事本,在记事本里面写上‘好’,另存为utf-8, 然后用 UItraEdit打开这个记事本,编辑-----》16进制编辑就能看到编码结果(如下图)
解析上面的结果:EF BB BF表示这是UTF-8编码而不是其他类型的编码,E5A5BD是‘好’字的UTF-8编码,后面的0D 0A 0D 0不知道是什么意思(求解)。
结论:结果正确。