Python编码与解码

一、什么是编码

编码是指信息从一种形式或格式转换为另一种形式或格式的过程。

在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息。众所周知,计算机能够读懂的是高低电平,也就是二进制位(0,1组合)。

而解码,就是指将计算机的能够读懂的信息转换为人能够读懂的信息。

二、 编码的发展渊源

之前的博客中已经提过,由于计算机最早在美国发明和使用,所以一开始人们使用的是ASCII编码。ASCII编码占用1个字节,8个二进制位,最多能够表示2**8=256个字符。

随着计算机的发展,ASCII码已经不能满足世界人民的需求。因为世界各国语言繁多,字符远远超过256个。所以各个国家都在ASCII基础上搞自己国家的编码。

例如中国,为了处理汉字,设计了GB2312编码,一共收录了7445个字符,包括6763个汉字和682个其它符号。1995年的汉字扩展规范GBK1.0收录了21886个符号。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

  

但是,在编码上,各国”各自为政“,很难互相交流。于是出现了Unicode编码。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。

Unicode规定字符最少使用2个字节表示,所以最少能够表示2**16=65536个字符。这样看来,问题似乎解决了,各国人民都能够将自己的文字和符号加入Unicode,从此就可以轻松交流了。

然而,在当时,计算机的内存容量可是寸土寸金的情况下,美国等北美洲国家是不接受这个编码的。因为这凭空增加了他们文件的体积,进而影响了内存使用率,影响工作效率。这就尴尬了。

显然国际标准在美国这边不受待见,所以应运而生产生了utf-8编码。

UTF-8,是对Unicode编码的压缩和优化,它不再要求最少使用2个字节,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。

这样,大家各取所需,皆大欢喜。

三、utf-8是如何节省存储空间和流量的

当计算机在工作时,内存中的数据一直是以Unicode的编码方式表示的,当数据要保存到磁盘或者网络传输时,才会使用utf-8编码进行操作。

  在计算机中,”I‘m 杰克"的unicode字符集是这样的编码表:

I	0x49
‘	0x27
m	0x6d
 	0x20
杰	0x6770
克	0x514b

  每个字符对应一个十六进制数(方便人们阅读,0x代表十六进制数),但是计算机只能读懂二进制数,所以,实际在计算机内表示如下:

I	0b1001001
‘	0b100111
m	0b1101101
 	0b100000
杰	0b110011101110000
克	0b101000101001011

  由于Unicode规定,每个字符最少占用2个字节,所以,以上字符串在内存中的实际占位如下:

I	00000000 01001001
‘	00000000 00100111
m	00000000 01101101
 	00000000 00100000
杰	01100111 01110000
克	01010001 01001011

  这串字符总共占用了12个字节,但是对比中英文的二进制码,可以发现,英文的前9位都是0,非常的浪费空间和流量。

看看utf-8是怎么解决的:

I	01001001
‘	00100111
m	01101101
 	00100000
杰	11100110 10011101 10110000
克	11100101 10000101 10001011

  utf-8用了10个字节,对比Unicode,少了2个字节。但是,我们的程序中很少用到中文,如果我们程序中90%的内容都是英文,那么可以节省45%的存储空间或者流量。

所以,在存储和传输时,大部分时候遵循utf-8编码

  

四、Python2.x与Python3.x中的编解码

1. 在Python2.x中,有两种字符串类型:str和unicode类型。str存bytes数据,unicode类型存unicode数据

由上图可以看出,str类型存储的是十六进制字节数据;unicode类型存储的是unicode数据。utf-8编码的中文占3个字节,unicode编码的中文占2个字节。

字节数据常用来存储和传输,unicode数据用来显示明文,那如何转换两种数据类型呢:

无论是utf-8还是gbk都只是一种编码规则,一种把unicode数据编码成字节数据的规则,所以utf-8编码的字节一定要用utf-8的规则解码,否则就会出现乱码或者报错的情况。

python2.x编码的特色:

为什么英文拼接成功了,而中文拼接就报错了?

这是因为在python2.x中,python解释器悄悄掩盖掉了 byte 到 unicode 的转换,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效,从而造成 UnicodeDecodeError 的错误。python2.x编码让程序在处理 ASCII 的时候更加简单。你付出的代价就是在处理非 ASCII 的时候将会失败。

2. 在Python3.x中,也只有两种字符串类型:str和bytes类型。

str类型存unicode数据,bytse类型存bytes数据,与python2.x比只是换了一下名字而已。

还记得之前博文中提到的这句话吗?ALL IS UNICODE NOW

python3 renamed the unicode type to str ,the old str type has been replaced by bytes.

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分,不再会对bytes字节串进行自动解码。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。

注意:无论python2,还是python3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)

 五、文件从磁盘到内存的编码

当我们在编辑文本的时候,字符在内存对应的是unicode编码的,这是因为unicode覆盖范围最广,几乎所有字符都可以显示。但是,当我们将文本等保存在磁盘时,数据是怎么变化的?

答案是通过某种编码方式编码的bytes字节串。比如utf-8,一种可变长编码,很好的节省了空间;当然还有历史产物的gbk编码等等。于是,在我们的文本编辑器软件都有默认的保存文件的编码方式,比如utf-8,比如gbk。当我们点击保存的时候,这些编辑软件已经"默默地"帮我们做了编码工作。

那当我们再打开这个文件时,软件又默默地给我们做了解码的工作,将数据再解码成unicode,然后就可以呈现明文给用户了!所以,unicode是离用户更近的数据,bytes是离计算机更近的数据。

其实,python解释器也类似于一个文本编辑器,它也有自己默认的编码方式。python2.x默认ASCII码,python3.x默认的utf-8,可以通过如下方式查询:

import sys
print(sys.getdefaultencoding())

如果我们不想使用默认的解释器编码,就得需要用户在文件开头声明了。还记得我们经常在python2.x中的声明吗?

#coding:utf-8

如果python2解释器去执行一个utf-8编码的文件,就会以默认的ASCII去解码utf-8,一旦程序中有中文,自然就解码错误了,所以我们在文件开头位置声明 #coding:utf-8,其实就是告诉解释器,你不要以默认的编码方式去解码这个文件,而是以utf-8来解码。而python3的解释器因为默认utf-8编码,所以就方便很多了。

参考资料

1. http://www.cnblogs.com/yuanchenqi/articles/5956943.html

2. http://www.cnblogs.com/284628487a/p/5584714.html

  

原文地址:https://www.cnblogs.com/52py/p/8297283.html

时间: 2024-10-26 18:35:23

Python编码与解码的相关文章

【Rollo的Python之路】Python 编码与解码

Python 编码与解码: 1.0 解码:encoding = 'utf-8/utf8/UTF-8/UTF8',要想解码,必须知道用什么方式编码的. with open('test','r',encoding = 'utf-8') as e: print(e.read()) 原文地址:https://www.cnblogs.com/rollost/p/10960987.html

Python—编码与解码(encode()和decode())

编码与解码 decode英文意思是解码,encode英文原意是编码. Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化.编码是 unicode -> str,解码是 str -> unicode. 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码, 即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码. decode的作用是将其他编码的字

python 编码与解码 decode解码 encode 编码

>>> '无'   #gbk字符'\xce\xde'>>> str1 = '\xce\xde'>>> str1.decode('gbk')  # 解码gbk为 unicodeu'\u65e0'>>> str1.decode('gbk').encode('utf-8') # 解码gbk为 unicode   编码unicode 为utf-8'\xe6\x97\xa0'>>> print str1.decode('gbk

python 编码与解码

不说废话,先上图 unicode编码只能在内存中使用,它是不能被保存到硬盘上的.所以我们需要对他进行“加工”,来使信息可以保存到硬盘上. 这时候我们就需要把unicode进行“编码”操作(encode):反过来,当把硬盘上的信息加载到内存中时,我们就需要 对信息进行“解码”操作(decode),这样计算器才能识别.这就是解码和编码的解释. 如果有不准确的地方,欢迎博友留言.

python 编码和解码

原文地址:https://www.cnblogs.com/fanweisheng/p/11217339.html

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

python中的编码与解码

编码与解码 首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示00110101,还是要显示'a',但计算机怎么知道00110101是'a'呢,这就需要解码,当选择用ascii解码时,当计算机读到00110101时就到对应的ascii表里一查发现是'a',就显示为'a' 编码:真实字符与二进制串的对应关系,真实字符→二进制串 解码:二进制串与真实字符的对应关系,二进制

Python中进行Base64编码和解码

Base64编码是一种“防君子不防小人”的编码方式.广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容易被破解,仅适用于加密非关键信息的场合Python中进行Base64编码和解码>>> import base64>>> s = '我是字符串'>>> a = base64.b64encode(s)>>>

从Python的角度来看编码与解码

导语: Python2和Python3中,因为默认字符集的不同而造成的麻烦,简直是程序员的梦魇!要彻底告别这个麻烦,就需要从本质上来理解编码和解码. 为什么要有编码? 对于不会英文的中国人来说,将英文翻译成中文,这个就叫做解码:而将中文翻译成英文,自然就是编码了! 这个道理在计算机中同样适用. 计算机只能识别0和1,任何文字对于计算机来说,就是0和1的排列组合.但是我们人类哪看得懂这种0和1的排列组合! 自然就需要将0和1的文字转换为我们能看得懂的文字,比如中文,英文等. 而这种0和1到文字的映