字符编码梳理

不同字符编码:ASCII ,ISO8859-1,GB2312,GBK,UTF-8

字符编码:

  • 规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系
  • 编码与解码的转换关系。

为什么有这么多的字符编码

       由于计算机的发展,刚开始计算机由美国人发明,他们只使用ASCII码即可表示所有的字符,但是之后越来越多的国家开始使用计算机,为了满足他们的需求于是有了其他的标准,新的标准表示的范围大了,必然所占用的空间增大,引起原本只需要使用ASCII国家的不满,于是为了减少占用的空间和硬盘空间,所以有了UTF-8等不定长的字符编码。

       总结一下:1. 满足不同国家的需求 2. 减少占用的空间和硬盘空间

各个字符编码的实现

字符编码

是否定长

占用空间

实现原理

备注

ASCII

单字节

使用单字节8位,前127个存储英文字母即标点符号

老美发明

ISO8859-1

单字节

扩展ASCII码,在128-255位置编入了新字符。

西欧国家使用

GB2312

1-2字节,不定长编码

高低位都存放大于127的数字,兼容ASCII码(英文1个字节,中文2个字节)

GBK2312只囊括简体中文

GBK

1-2字节,不定长编码

扩展GB2312,高位存放大于127的数字,低位将127之前的数字也囊括了

GBK囊括繁体中文

UTF-8

1-4字节,不定长编码

是一种Unicode的一种编码实现

老美不满意Unicode的ASCII的双字节编码

GB2312:

       兼容ASCII码,当是英文字符时,使用一个字节进行存储和读取,当是中文字符时使用两个字节进行存储和读取。存储中文时,高位和低位的最高位皆为1,存放大于127的数字,即取高位字节时,若大于127则表示是中文字符,将读取双字节进行识别,若小于127,则认为是英文字符,单字节识别。

GBK:

       对GB2312的扩展,低位不再存储大于127的数字,将低于127的数字也包括进来,囊括了繁体字符。

UTF-8的编码规则:

UTF-8最大的特点,变长的编码方式,使用1-4个字节表示一个符号

  1. 对于单字节的符号,字节的最高位设为0,后面7位为这个符号的Unicode码
  2. 对于n字节的符号,第一个字节的前n位皆为1,n+1位为0,后面字节的前两位开头一律为10,剩下的为该字符的Unicode码。

0xxxxxxx

110xxxxx 10xxxxxx

1110xxxx 10xxxxxx 10xxxxxx

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

UnicodeUTF-8有什么关系

  • Unicode是字符集,是用双字节编码表示,囊括了全球所有的字符,为每一个字符分配一个唯一的ID,不管ID如何存储。(对于ASCII码,高位补0)
  • UTF-8是字符编码规则,UTF-8是Unicode的实现方式之一,定义如何存储编码ID的一种方法,将码位转换为字节序列的规则。这样让计算机看到某个标记就知道要读取几个字节的代码,避免问题的发生。(容错性)

 

不考虑历史因素,从技术角度解释为什么在unicode和UTF-8大行其道的同时,GB2312和GBK仍在广泛使用。

       三者皆使用了变长编码。GB2312和GBK表示中文字符占用2个字节,兼容ASCII码;UTF-8也兼容ASCII码,但UTF-8中的中文字符需要使用3-4个字节表示,大部分为3个字节。因此对于中英文混合编写的使用GB2312和GBK更省空间、效率更高。

 

参考:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值