ASCII、gbk、Unicode、utf编码介绍及异同

ASCII、Unicode、GBK、UTF编码介绍及异同

使用Python时会时常遇到编码问题,这是我的一些小结。
参考链接:
https://blog.csdn.net/QuinnNorris/article/details/78705723
https://www.cnblogs.com/geons/p/9352256.html

相关概念

  • 字符
    各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等

  • 字符集
    一个系统支持的所有抽象字符的集合。字符是文字和符号的总称,包含各个国家文字、标点符号、图像符号、数字等。它为每一个字符分配一个唯一的ID,一般称之为码位、码点。

  • 字符编码
    它是一套规则,使用该规则能够将自然语言的字符的一个集合与其他东西的一个集合进行配对,在符号集合和数字系统中建立映射联系。在计算机中,处理信息是利用元件不同状态组合来存储和处理信息的,因此,字符编码就是将符号转化为计算机可以接受的数字系统的数,称为数字代码。它将上面字符集的码位转化为字节序列的规则,此过程称之为编码、解码。

  • 常见字符集 : ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

  • 常见字符编码
    ASCII只有一种;大多数MBCS(包括GB2312,GBK)也只有一种;Unicode可依不同需要以UTF-8、UTF-16、UTF-32等方式编码。

字符编码种类

  • ASCLL编码
    ASCII码是西欧编码的方式,采取7位编码,所以是2^7=128,共可以表示128个字符,包括34个字符,(如换行LF,回车CR等),其余94位为英文字母和标点符号及运算符号等。
    在这里插入图暗示出来了片描述

  • 非ASCII码
    英语用128个符号编码足够了,但是用来表示其他语言显然是不够的,于是,欧洲有些国家利用字节中闲置的最高位编入了新的符号,这样一来,欧洲国家使用的编码体系,可以最多表示256个字符。 但是到了亚洲国家,使用的符号更多了,光汉字就10万多个,一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如常见的GB2312编码,使用两个字节表示一个汉字,所以理论上最多可以表示256*256=65536个符号。

    • GB2312
      GB2312是1981年开始实施的一套汉字处理的编码方案,GB是“基本”的意思,GB2312是对ASCII进行了扩展,在原来ASCII的基础上扩充了6000多个汉字和600多个其他字符,是我们使用的较早的一个汉字编码版本。
    • GBK码
      GBK编码是对GB2312的扩展,完全兼容GB2312。采用双字节编码方案,剔出xx7F码位,共23940个码位,共收录汉字和图形符号21886个,GBK编码方案于1995年12月15日发布。它几乎完美支持汉字,因此经常会遇见GBK与Unicode的转换。
    • Unicode码
      unicode编码表中包含了世界上所有国家的所有字符和符号的编码。
      unicode编码是一种概念,在最新的规范中,所有的字符一概使用四个字节表示,网上有很多说unicode用两个字节表示一个字符是不对的,Unicode字符分为17组编排,0x0000 至 0xFFFF,而每平面拥有65536个码位,共1114112个。
    • UTF字符编码
      随着互联网的发展,强烈要求出现一种统一的编码方式。UTF8就是在互联网中使用最多的对Unicode的实现方式。还有其他实现,比如UTF16(字符用2个字节或者4个字节表示),UTF32(字符用4个字节表示)。UTF8是Unicode的实现方式之一,也是最为常见的实现方式。
      • utf-8字符编码

         特点:
         1.UTF-8灵活性很强,用1~4个字节表示一个字符。
         2. 当字符在ASCII中可以被表示时,UTF-8编码方式就用一个字节来表示它。
         3. 在UTF-8中汉字用3个字符来表示。
         4. unicode中所有的字符一概使用两个字节表示。从unicode到UTF-8并不是直接的对应,而是要过一些算法和规则来转换。
        
      • UTF-16字符编码

        特点:
         1.在绝大多数情况下,UTF-16中一个字符固定使用两个字节编码,一个字符两个字节是UTF-16编码的概念。
         2.在极少数情况下也会出现三个字节表示一个字符的情况。 由于UTF-16固定使用两个字节表示一个字符,所以UTF-16不能与ASCII兼容。
         3.在不同的机器中UTF-16存在因存储方式不同(大端法和小端法)导致数据有误,因此存在UTF16-LE和UTF16-BE两种UTF16的变体。
         4.相比较UTF-8,在存储中文方面,UTF16更加结合空间。
         5.UTF-16容错情况比UTF-8好,因为UTF-16稳定使用两个字节编码,如果数据错误不会连代其他数据被读错,而UTF-8是变长编码,可能导致后面的字符全部错误。
         6.UTF-16广泛应用在各种系统中。
        
      • UTF-32字符编码
        UTF-32可以说是“真正”的unicode编码,unicode用四个字节表示一个字符的特点在UTF-32中实现了,理论上这样根本不需要复杂的分配字节的方法,只需要每个字符一一对应即可,而且UTF-32的超大容量装得下任何的字符。但是问题也就在这里,一个字符需要四个字节太过于奢侈,UTF-32并不是一个很常用的编码方法。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值