字符(Char):是一个信息单位,在计算机里面,一个中文汉字是一个字符,一个英文字母是一个字符,一个阿拉伯数字是一个字符,一个标点符号也是一个字符。
字符集(Charset):是一个系统所支持的所有的抽象字符的集合。其中字符为各种文字和符号的总称。
字符编码(Character Encoding):是一套法则,使用该法则,可以使自然语言中的一套字符集合 与 其他东西的一个集合进行配对。即在符号结合和数字系统之间建立一套关系。通俗地讲,字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
常用的字符集:
常见的有:ASCII字符集,GB2312字符集,BIG5字符集,Unicode字符集
ASCII字符集和编码:
ASCII是基于拉丁字母的一套编码,主要用于现代英语,勉强支持西欧语言。
ASCII字符集:包含了控制字符(换行,退格键,回车键),可显示字符等。
ASCII编码:将ASCII字符集转换为计算机可以识别的编码规则。使用7位(bits)表示一个字符,可以支持128个字符。使用8位(bits)表示一个字符,共支持256个字符
ASCII编码最大的缺点:只能显示26个基本的英文字符,阿拉伯数字,英式标点符号等共256个字符。
GBXXXX字符集和编码:
天朝有了计算机后,必须引入一套规则,用于将汉子转换为计算机可以接受的数字系统的数。
天朝专家把127号以后的字符都取消掉,并且规定:小于127的字符的意义与原来相同,大于127的字符,每两个连在一起表示一个汉字,前面一个字节成为高字节,后面一个字节成为低字节,这样大约组合出来7000个左右的汉字,在这些编码里,连ASCII里本来就有的数字,标点符号统统重写编写了一遍,这就是常说的“全角”“半角”字符,127以前的称谓半角字符。
特点:采用了多字节编码,每个字可以由1,2个或者4个字节组成
BIG5字符集和编码:
BIG5字符集主要用来表示“繁体中文”,称为大5码。它是一套双字节字符集,使用了双八码存储方法,使用两个字节来安放一个字,第一个字节称为“高位字节”,第二个字节称为低位字节。
伟大的创想-Unicode:
为了解决世界上各种语言的问题,防止互相访问出现乱码的情况,产生了Unicode。
Unicode是基于通用字符集发展的,被称为统一码,万国码。
Unicode 与 UTF-8 UTF-16 UTF-32:
简述:Unicode是字符集,UTF-8/16/32 是三种字符编码方案:
UTF-32:
使用4个字节(32位)的数字来表达每个字母,数字。每个数字使用4个字节来表示,就空间效率而言,是非常没有效率的。
这种方法也有优点,因为其每个字母/数字使用4个字节数字来表示的,所以一个字符串中的第N个字符是从4*N个字节开始的,即每一个字符的长度都是固定的。
UTF-16:
尽管unicode表示的字符非常多,但是通常使用不会超过前65535个字符,所以,UTF-16使用2个字节(16位)的数字来表示系统中的每个字母,数字,符号等。它最明显的优点就是空间效率上是utf-32的两倍。
UTF-8:
UTF-8是基于Unicode的一种可变长度的字符编码,它可以表示Unicode中的任何一个字符,且编码的第一个字节与ASCII完全兼容。
UTF-8使用一到四个字节来表示一个字符。
(1) 128个ASCII字符,只需要1个字节编码
(2) 带有附加符号的拉丁文,阿拉伯文等需要2个字节编码
(3) 其他基本多文种平面,通常使用3个字节编码
(4) 极少多食用4个字节编码
优点:
UTF-8不存在字节顺序的问题(UTF-16存在),一份以utf-8编码的文件,在不同的计算机之间,是一份相同的bit流。
UTF-8是ASCII的超集,因为一个纯ASCII编码的字符,也是一个合法的UTF-8编码字符。
缺点:
因为每个字符使用不同数量的字节编码,所以一个字符串中想要定位一个字符的位置,就会很复杂。
Unicode 转 UTF-8的规则:
比如“汉”字,其Unicode编码是6C49,6C49在 0800-FFFF之间,所以才用第三套模版转换。
6C49转换成二进制是0110 1100 0100 1001 ,把这个比特流转换成第三套模版就是 0110 110001 001001
然后填充到1110xxxx 10xxxxxx 10xxxxxx中x的位置上
即为11100110 10110001 10001001 即E6 B1 89 这就是UTF8编码
一个有趣的问题,当你在windows电脑桌面建立一个文本文件,输入“联通”两个字后,重新打开,会出现乱码。
答:
文本文件的默认编码是ANSI,属于GBxx系列,每个汉字采用2个字节编码。所以“联通”对应的编码为:
可以看到第一个字符的 高位字节前三位是110 低位字节前2位是10
第二个字符的 高位字节前三位110,低位字节前2位是10
这一下就跟UTF-8编码的第二套规则相符合,系统就会认为这是utf8编码,然后在解码的时候就采用了错误的方式,导致了乱码。