说起python编码,真是句句心酸,今天终于是,终于梳理清楚了,下面我们就来一起揭开py编码的真相吧!

一,什么是编码?

其实基本概念很简单。我们都知道消息,那么消息就是人类所能理解的,简单易懂的存在,那么我将这种存在表示为“明文”。我们把写在纸张上的英文单词看做“明文”,那么对于不懂英文的人来说,就需要翻译成他所能看懂的语言格式。这种从明文到编码文件的转换称为“编码”,从编码文本转换成"明文"称为“解码”.

那么到底什么是编码呢?

其实计算机所能识别的所有的数据文件,都是以二进制文件存在的。也就是说计算机想要执行我们发出的指令,就必须把文件编码成二进制文件才能运行。意味着我们认识的字符要对应唯一的二进制数字,那么老外用0和1来表示二进制的数字。8位表示一组就能表示出256中不同的状态,每种状态就表示唯一的字符。英文只有26个字母,加上一个符号足够用了,每个0或者1表示一个比特位,约定8个比特位构成一个字节,而计算机需要用127个不同的字节来存储英文单词,这就叫ASCII编码。

扩展ANSI编码
刚才说了,最开始,一个字节有八位,但是最高位没用上,默认为0;后来为了计算机也可以表示拉丁文,就将最后一位也用上了,
从128到255的字符集对应拉丁文啦。至此,一个字节就用满了!

当计算机来到中国的时候,不识别中文,无法显示中文,而且一个字节的所有的状态位都被占满了,那怎么办呢?中国人直接把表示最后一位的阿拉丁文给干掉了,规定一个小于127的字符,并且意义和原来的一致,当两个大于127的字符连在一起的时候,就组成的汉字,这样大概能组成7000多汉字,这就叫“GB2312”,是对ASCII的中文扩展.

但是汉字太多了,BG2312也不够用啊,于是就规定只要第一个字节大于127的,就固定表示这是一个汉字的开始,不管后面跟的是不是扩展集里面的内容。这种扩展之后的方案叫做"GBK",GBK包含了所有GB2312的内容.同时也增加了20000多个汉字和符号.

那么在国内我们的问题解决了,同样的其他国家遇到的问题也解决了,但是国家和国家之间的语言交互还是无法识别的,怎么办呢?所以国际标准化组织就把所有国家的编码格式汇总到一起,搞了个号称标准编码的码表,叫UNICODE.

UNICODE是用两个字节来表示为一个字符,它总共可以组合出65535不同的字符,这足以覆盖世界上所有符号(包括甲骨文)

为啥又有一个UTF-8呢?

大家想一下,对于英文界的人来说,存储一个字母A用00010001就足够了,但是用上了UNICODE之后需要00000000 00010001表示才行,显得很浪费啊,基于此,科学家又提出了UTF-8,这是一个可变长度的编码,他可以用1~4个字节表示一个符号,可根据符号的长度而变化字节长度。当字节在ASCII范围内的时候,就表示一个字节,所以就兼容ASCII码的。

这样的好处:

虽然我们在内存中存储的数据都是unicode,但是当数据要保存到磁盘或者网络传输的时候,显然uft8就比较节省空间了。

unicode和utf-8的区别或者关系是什么呢?

unicode是内存编码表示规范方案,而utf-8是如何保存和传输unicode的实现方案。

在py2中有两种字符串类型,一种是str,一种是unicode,这两种数据类型在程序运行时的内存地址是什么呢?

>>> s1 = '电'   #字符串

>>> print(type(s1))
<type 'str'>   #类型
>>> print(repr(s1))   #repr查看内存存储内容
'\xe7\x94\xb5'   #内存中的内容
>>> s2 = u'电'
>>> print(type(s2))
<type 'unicode'>   #unicode类型
>>> print(repr(s2))
u'\u7535'     #内存中的内存

内置函数repr可以帮我们在这里显示存储内容。原来,str和unicode分别存的是字节数据和unicode数据;那么两种数据之间是什么关心呢?如何转换呢?这里就涉及到编码(encode)和解码(decode)了

需知:

1.在python2默认编码是ASCII, python3里默认是unicode

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

python之字符编码与转码的更多相关文章

  1. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  2. Python中字符编码及转码

    python 字符编码及转码 python 默认编码 python 2.X 默认的字符编码是ASCII, 默认的文件编码也是ASCII python 3.X 默认的字符编码是unicode,默认的文件 ...

  3. python(字符编码与转码)

    一.字符编码演变史 二进制(0 1) """ 算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的,再说简单点 ...

  4. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  5. 【python】-- 字符串、字符编码与转码

    字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可:访问子字符串,可以使用方括号来截取字符串: var1 ...

  6. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...

  7. 小白的Python之路 day2 字符编码和转码

    字符编码和转码 详细文章: http://www.cnblogs.com/yuanchenqi/articles/5956943.html http://www.diveintopython3.net ...

  8. Python字符编码与转码

    字符编码与转码 注: 该图转自 http://www.cnblogs.com/luotianshuai/p/5735051.html. Python2 解码,编码 #Python2 #-*- codi ...

  9. Python的字符编码

    Python的字符编码 1. Python字符编码简介 1. 1  ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...

随机推荐

  1. 一行python代码搞定文件分享

    给同事分享文件,如你所知通过聊天工具,网盘或linux命令各种方法,还有一个也可以尝试下:使用一行python代码快速搭建一个http服务器在局域网内进行下载. python3使用: python3 ...

  2. pc端适配移动端

    pc端和移动端共用一套代码 1. 允许网页宽度自动调整 在网页代码的头部,加入一行viewport元标签 <meta name="viewport" content=&quo ...

  3. 【30分钟学完】canvas动画|游戏基础(5):重力加速度与模拟摩擦力

    前言 解决运动和碰撞问题后,我们为了让运动环境更加自然,需要加入一些环境因子,比如常见的重力加速度和模拟摩擦力. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 重力加速度 ...

  4. SpringBoot整合Mybatis对单表的增、删、改、查操作

    一.目标 SpringBoot整合Mybatis对单表的增.删.改.查操作 二.开发工具及项目环境 IDE: IntelliJ IDEA 2019.3 SQL:Navicat for MySQL 三. ...

  5. 使用VMware12在CentOS7上部署docker实例

    今天下午算是自己搞了一下午才搞出来,对于认为linux是自己死穴的我,现在能搞出来,心里滋味不是一丢丢,哈哈~~~ 算了,废话不多说,直接上图!步骤如下: 1.在安装好VMware12并安装好了cen ...

  6. Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

    背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...

  7. React的组件

    React的组件化思想尤为明显,一切皆组件,觉着比Vue的组件化思想更加凸显. const PacketBG = (props) =>( <div className="pack ...

  8. 【Python challenge】通关代码及攻略(0-11)

    前言: 最近找到一个有关python的游戏闯关,这是游戏中的思考及通关攻略 最开始位于:http://www.pythonchallenge.com/pc/def/0.html 第0关 题目分析 提示 ...

  9. jenkins操作

    jenkins忘记用户名以及登录密码的解决方法 1.jenkins 根目录下找到config.xml,修改配置  <useSecurity>true</useSecurity> ...

  10. python3.4.3 连接Oracle生成报表并发送邮件

    python很简单,又很实用.当有需求时用起来会更有方向,大可不必从语法.循环等基础看起. 由于工作需要,每天要拉一份报表发给业务的同事,先是用SSIS做了个包部署到服务器上,每天定时拉报表发邮件给同 ...