一篇文章搞懂python2、3编码
说在前边:
编码问题一直困扰着每一个程序员的编程之路,如果不将它彻底搞清楚,那么你的的这条路一定会走的格外艰辛,尤其是针对使用python的程序员来说,这一问题更加显著,
因为python有两个版本,这两个版本编码格式却完全不同,但我们却经常需要兼顾这两个版本,所以出现各种问题的几率就大了很多。
所以在这里我试图用一篇文章来彻底梳理整个python语言的编码问题,尽量降低以后在这方面举到问题的可能性。
ps 此文一定程度上参考和引用了alex的博客:“https://www.cnblogs.com/alex3714/articles/7550940.html”
说编码,首先得知道什么是编码,为什么会有编码:
百度百科上的解释是:“编码是信息从一种形式转换为另一种形式的过程”,这其实是一个过程,而我们常说的“编码问题”,其实更多的是指“编码格式问题”。
常见的编码格式有:
ASCII 占一个字节,只支持英文
GB2312 占2个字节,支持6700多个汉字
GBK GB2312的升级版,支持的汉字更多(21000+汉字)
Shift-JIS 日本字符
因为计算机只识别二进制,每个字符想要被计算机识别,那么它就需要有字符和二进制之间的对应关系,而每个国家都有自己的字符,但是也仅包含本国字符,
导致本国软件、系统,到了国外就会乱码,从而为了解决这一问题,“万国码”(Unicode)出现了,它包含了全球所有文字和其二进制的对应关系。
Unicode 2-4字节,已经收录了136690+字符,且依旧在扩充。
它支持全球所有语言,每个国家都不用使用原先的本国编码,用Unicode就万事大吉。
Unicode解决了字符和二进制之间的对应关系,但是仍有一个问题没有解决,那就是空间问题,因为Unicode使用2-4个字节标识一个字符,二原先的ASCII码虽然只支持英文,
但是一个英文字母只占1个字节,原先 “Python” 用ASCII占6字节,现在用Unicode却要占12字节,在存储和网络传输过程中是很大的负担,所以推生出另一种编码出现:
"UTF" (Unicode Transformation Format),即对Unicode的转换,目的是存储和传输过程中节省空间。
UTF-8 : 使用 1、2、3、4个字节表示所有字符,优先使用1个字符,无法满足即增加一个字节,最多使用4字节:英文1字节,欧洲语系2字节,东亚3字节(中文),特殊字符4字节。
UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32: 使用4个字节表示所有字符;
(UTF是为Unicode编码格式设计的一种在存储与运输时节省空间的编码方案)
整体编码背景说完,我们该来说说python的编码了:
由于最开始出现的时python2,所以我们从它开始说:
龟叔当初开发python时,估计没想到它会这儿的火,所以就将ASCII来当作了默认编码,所以python中的默认编码是ASCII.



我们在python中输入 s = '宋讼颂'后,使用print来打印,确实是“宋讼颂”没错,但是当你直接调用s时,却出现的是一个个的16进制表示的二进制字节,我们将其称之为bytes类型(字节类型)
我们打印出它的类型,确是“str”,实际上在 python2中 bytes == str ,然后python2中还有一个单独的类型,就是unicode,将str解码后就变成了unicode,然后当你想从unicode编码转成gbk编码时,
只需要在对其进行编码,就ok,所以我们一定要记住,unicode是桥梁,任何两种编码想要相互转换,都需要decode('utf-8')将其先转为unicode,再经过encode()转换为想要的编码。
python3横空出世:
在2008年,python3横空出世,不兼容python2,字符串变成了unicode, 文件默认编码变为了utf-8,意味着只要用python3编写的代码,无论程序是以哪种编码开发的,任何电脑都可以显示。
这时的str和bytes已经不同了,str就是unicode格式的字符串,但是bytes就是单纯的二进制文件啦。


从这张图我们就可以看到,这时的字符串已经是unicode类型了,所以就不能decode()了。
而bytes已经仅仅表示二进制文件啦。
一篇文章搞懂python2、3编码的更多相关文章
- 一篇文章搞懂高级程序员、架构师、技术总监、CTO从薪资到技能的区别
一篇文章搞懂高级程序员.架构师.技术总监.CTO从薪资到技能的区别 http://youzhixueyuan.com/senior-programmers-architects-technical-d ...
- 不想再被鄙视?那就看进来! 一文搞懂Python2字符编码
程序员都自视清高,觉得自己是创造者,经常鄙视不太懂技术的产品或者QA.可悲的是,程序员之间也相互鄙视,程序员的鄙视链流传甚广,作为一个Python程序员,自然最关心的是下面这幅图啦 我们项目组一值使用 ...
- 五分钟学Java:一篇文章搞懂spring和springMVC
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是Spring,为什么你要学习spring? 你第一次接触spring框架是在什么时候?相信很多人和我一样,第一次了 ...
- 一篇文章搞懂filebeat(ELK)
本文使用的filebeat是7.7.0的版本本文从如下几个方面说明: filebeat是什么,可以用来干嘛 filebeat的原理是怎样的,怎么构成的 filebeat应该怎么玩 一.filebeat ...
- 一篇文章搞懂Android组件化
网上组件化的文章很多,我本人学习组建化的过程也借鉴了网上先辈们的文章.但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉.而我写这篇文章的初衷就是由上而下,希望 ...
- 一篇文章搞懂DOM
学习JavaScript肯定是会遇到DOM操作,那么什么是DOM?它又是干嘛用的?这篇文章为你揭晓答案. DOM是document object model的缩写,简称文档对象模型. 简单的说DOM是 ...
- 一篇文章搞懂Linux安全!
Linux是开放源代码的免费正版软件,同时也是因为较之微软的Windows NT网络操作系统而言,Linux系统具有更好的稳定性.效率性和安全性. 在Internet/Intranet的大量应用中,网 ...
- InfluxDB从原理到实战 - 一篇文章搞懂InfluxDB时区
0x00 简介 InfluxDB默认以UTC时间存储并返回时间戳,当接收到一个时序数据记录时,InfluxDB将时间戳从本地时区时间转换为UTC时间并存储,查询时,InfluxDB返回的时间戳对 ...
- 一篇文章搞懂Python装饰器所有用法
01. 装饰器语法糖 如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上 ...
随机推荐
- React使用JSX语法
目录: 1.在React项目中启用JSX语法 2.在JSX中写js代码 3.使用JSX注意事项 1.在React项目中启用JSX语法 <--返回目录 JSX语法:符合xml规范的js语法 JS ...
- jquery trigger() 方法 语法
jquery trigger() 方法 语法 作用:trigger() 方法触发被选元素的指定事件类型.深圳大理石平台 触发事件:规定被选元素要触发的事件. 语法:$(selector).trigge ...
- noi.ac #531 神树和物品
题目链接:戳我 决策单调性 (蒟蒻终于会写决策单调性啦!考试全场切这题就我不会啊嘤) (证明?不会啊,自己打表看QAQ) 44pts \(O(n^2)\)代码: #include<iostrea ...
- 面试题:MySQL索引为什么用B+树?
面试题:MySQL索引为什么用B+树? 前言 讲到索引,第一反应肯定是能提高查询效率.例如书的目录,想要查找某一章节,会先从目录中定位.如果没有目录,那么就需要将所有内容都看一遍才能找到. 索引的设计 ...
- Codeforces 981 D.Bookshelves(数位DP)
Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...
- Java String字符串的不可变
Java 通过把String类设计为final使类不可继承,将变量value设置为private并且是final的,且value没有setter方法,不可修改. 为什么这么设计: 1.字符串常量池的需 ...
- Bzoj3073Journeys
这不裸的dij吗?来,弄他. 打完以后发现不妙,这数据范围略神奇……算一算,考一场都可能跑不出来.map去重边(成功额外引入log)不怕,交.TLE,54. 这不玩呢吗,把map去了,交.MLE,71 ...
- github搜索不到代码的问题
Hi team, Please check the following three query url :https://github.com/Konctantin/GreyMagic/search? ...
- 885. Spiral Matrix III
On a 2 dimensional grid with R rows and C columns, we start at (r0, c0) facing east. Here, the north ...
- H5 页面适配几种展现形式
1.contain 模式:以内容中心为基点按照视觉稿的宽高比缩放以适配窗口显示全页面内容,窗口与内容的宽度比或高度比之间较小者缩放填满窗口,当窗口宽高比和视觉稿不同时,另一方向的两侧出现留空部分. 2 ...