计算机发展以来先产生了 ASCII 码,用来代表 生活中出现的 常用字符,比如数字、字母等,不仅有可显示字符,还有33个控制字符,比如换行、结尾等等。ASCII码一共有127个字符,如下图:
随着计算机的进一步发展,人们看到了更大的可能, 不再局限于使用这些字符。各国人民开始将自己国家的文字添加到体系中,由此产生了多种字符集。 比如 中国普遍使用的gbk、中国台湾人民使用的Big5等等。因为ASCII的字符集 产生的很早,所以各国都是在此基础上扩展自己的字符集,涉及到ASCII 已存在的字符集,大家都是认可的,所以,看不到英文和数字乱码,常见的中文乱码就是因为编解码使用的字符集不同而产生的。
此时,ISO组织看到这个情况,越来越难搞,干脆推出了统一的字符集:Unicode
Unicode 和 其他字符集的 区别是:
gbk 字符集规定了用两个字节来编码字符,比如 ‘A’和‘中’ 都要用两个字节来编码表示。
Unicode 发明了多种编码方式,比如 :utf-8 、utf-16、utf-2都是其编码方式,可以通过不同的编码方式来表示同一个字符。(其实没什么区别,又不会同时使用多种编码方式)
utf-2 用两个字节来编码字符,可以表示所有的常用字符,utf-16使用四个字节来编码字符,可以表示所有的字符,包括远古文字等
最叼的发明应该是 utf-8, utf-8采用可变长度字节来编码字符:
对于ASCII 存在的字符,使用单字节来编码,首位为0,表示读取一个字节就解码。
对于中文和常用字符,使用双字节来编码,首位为 110,表示一次读取两个字节再解码,
对于剩下的字符,使用三字节来编码,首位为1110,表示一次读取三个字节再解码。
对于特殊字符,还可以使用四个字节来编码。
必要解释:
编码:将 字符 转换为 字节流 (类似于 加密)
解码:将 字节流 转换为 字符 (类似于 解密)
字符集:字符的集合,例如 ASCII字符集,定义了128个字符,GB2312定义了7445个字符,而计算机系统提到的字符集,值得是已编号的字符的有序集合。
字符码:指的是字符集中每个字符的数字编码。
字符编码:是将字符中的 字符码 转换为 字节码的一种规则或方法。在Unicode中,编号可以通过多种编码方式来转换为 字节流,在其他的字符集中,只有一种编码方式来将字符装换为 字节流,所以也就像是 字符 和 字节流的对应关系,没有了编号这个概念,耦合性很高。
字节:8 bit
字符: 一个文化符号
ASCII: 127个字符的字符集
gbk: 中文的字符集 ,也是编码方式
unicode : 包括了所有字符的字符集
utf-8 /utf-16: unicode的 编码方式
ANSI: 当前系统的默认编码方式
BOM 标记:有些字节流中带有BOM标识,用来告诉软件,这个什么编码的字节流,有助于解码。主要用在当ASCII 和 UTF-8 字节流对英文处理时,字节流一样,软件不能判断编码方式的时候。
推荐链接: 非常详细和认真,收益匪浅
字符集与编码[上] :https://www.cnblogs.com/xugang/archive/2010/04/07/1706232.html
字符集与编码[下] :https://www.cnblogs.com/xugang/archive/2010/05/08/1730451.html
字符编码(1)——Unicode,utf-8 :https://www.cnblogs.com/jams742003/archive/2010/03/25/1695421.html