Python ASCII GB2312 unicode UTF8 一文全解

本文转载自Python | Python学习之unicode和utf8 - JavaShuo

开始以前咱们先了解下ASCII、GB23十二、unicode、UTF-8都是啥?python

编码演化史


ASCII编码

在好久好久之前,美国人发明了计算机,计算机只能处理数字也就是把文字转换为8个bit也就是一个字节,8个bit最大能表示的数字为255,而[A-Z]、[a-z]、[0-9]再加上键盘上的一些符号正好255个,因此ASCII编码就成为了美国人的标准编码(用一个字节表明一个字母或者符号),正好也知足了美国人的需求。windows

GB2312

有了上面的状况,我大中国表示不服,咱们中国汉字博大精深,255个明显是知足不了咱们的需求的,因而咱们就发明了GB2312编码(用两个字节表示汉字),不只包含了ASCII码还能表示咱们的中国的汉字,因而有了咱们中国的例子,世界各国纷纷研究出了支持本身语言的编码,在这种状况下多种语言混合显示就出现了乱码的状况了,对于这种状况就出现了unicode编码将全部语言统一到一块儿。多线程

GB2312和GBK区别

1、收录不同:GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;

                        GBK共收入21886个汉字和图形符号。

2、表示不同:GB2312对任意一个图形字符都采用两个字节表示,并对所收汉字进行了“分区”处理,每区含有94个汉字/符号,分别对应第一字节和第二字节。

                       GBK采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间。

3、处理功能不同:对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK 及GB18030 汉字字符集的出现。

unicode

unicode编码的出现解决了多国语言展现乱码的问题,可是unicode的解决方案在全英文文档展现的状况下,unicode编码会比ASCII编码多一倍的存储空间(unicode的编码是16bit的,在表示ASCII编码时是直接在前面加上8个0)相应的在传输的时候就多了一倍的传输时间,在这种状况下就出现了UTF8编码。python2.7

UTF8

UTF8编码相比于8bit的ASCII编码和16bit的unicode编码来讲,UTF8编码是不定长的,它可使用两个字节表明英文,用三个字节表明中文,UTF8这个时候优点就很大了,在实际运用中,咱们能够将文件编码互相转换以获取最大化的利用内存,把文件保存在内存中咱们采用内存占用更小的UTF8编码的格式,读写文件时咱们采用更大更全的unicode编码,具体实例图以下:ide

代码演示


Python2.7

windows编码

在python2.7中当要将字符串encode为utf8,咱们须要确保以前的字符串的编码方式为unicode,因此当字符串编码不为unicode时,咱们须要使用decode方法,而在使用decode方法时咱们须要指明原有字符串的编码格式(在windows系统中解释器默认编码为GB2312,Linux系统中为UTF-8编码),因此就有了s.decode("gb2312").encode("utf-8")。
 

Linux

按照上面解读,咱们在Linux系统下操做以下:blog

这里就有一个疑问既然原有系统默认的字符串编码为utf-8,为何不能够直接使用s.decode().encode('utf-8')?缘由就是,如若不指定原有的系统编码格式(utf-8),Linux系统下会调用python解释器的默认编码ASCII解析字符串,演示以下:


因此在根据上面的状况,在python2中出现编码互转的状况,能够参考下图:

Python3.6

Python2.7和Python3.6最大的区别就是在执行Python2.7项目时,当项目中包含汉字时,须要在文件头声明编码格式,不然项目中的中文显示就是乱码。
而在Python3中彻底没有这样的顾虑,那是由于默认python3中所有的字符串就是unicode能够直接使用encode方法。

综上:为了不给本身添麻烦,请认准unicode和UTF-8编码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值