python之字符编码与转码
说起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之字符编码与转码的更多相关文章
- Python基础-字符编码与转码
***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...
- Python中字符编码及转码
python 字符编码及转码 python 默认编码 python 2.X 默认的字符编码是ASCII, 默认的文件编码也是ASCII python 3.X 默认的字符编码是unicode,默认的文件 ...
- python(字符编码与转码)
一.字符编码演变史 二进制(0 1) """ 算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的,再说简单点 ...
- Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数
1. 集合 1.1 特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...
- 【python】-- 字符串、字符编码与转码
字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可:访问子字符串,可以使用方括号来截取字符串: var1 ...
- python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
- 小白的Python之路 day2 字符编码和转码
字符编码和转码 详细文章: http://www.cnblogs.com/yuanchenqi/articles/5956943.html http://www.diveintopython3.net ...
- Python字符编码与转码
字符编码与转码 注: 该图转自 http://www.cnblogs.com/luotianshuai/p/5735051.html. Python2 解码,编码 #Python2 #-*- codi ...
- Python的字符编码
Python的字符编码 1. Python字符编码简介 1. 1 ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...
随机推荐
- py基础之有序列表
L =['adam',95.5,'lisa',85,'bart','bart',59]print (L)#list是一种有序的列表,可以使用索引访问每个list中的值print (L[1])#list ...
- sql02
1.小练习: 一切数据都是有用的,当我们删除时只是象征性设置一个标志位: 2.SQL学习 1)创建数据库 create database DbName; 使用--注释 多行注释/**/ 2)删除数据库 ...
- 002-DOM事件实例-实现一个可以拖拽的登陆窗口
前言:这是跟着慕课网一个老师的视频做的,这几天在重新的梳理自己,写完这个例子要系统的学一下jQuery,我司现在用的还是比较多,毕竟用了它不用考虑IE兼容性,可以让开发更有效率. 1.项目需求及基本的 ...
- C++泛化双向链表
泛型双向链表 双向链表(doublyLinkedList.h) /******************************************************************* ...
- Java的三魂七魄 —— 高级多线程
目录 Java的三魂七魄 -- 高级多线程 一.多线程的创建 二.线程安全问题 三.线程通信问题 四.更多实例 1.用线程同步的方法解决单例模式的线程安全问题 2.银行存钱问题(线程安全问题) 3.生 ...
- mysql从5.5升级到5.7遇到的坑
在安装mysql5.7时很顺利安装完成,但在启动项目时报错: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clau ...
- js的Set和Map集合
目录 1.js的Set介绍 1-1.Set基础用法 1-2.Set对象的操作方法 1-3.Set对象的遍历方法 2.js的Set扩展WeakSet篇 3.js的Map介绍 3-1.Map基础用法 3- ...
- 前端---css3优化
一.视差滚动(经过优化后的代码) .front::before { content: ''; position: fixed; // 代替background-attachment width: 10 ...
- Ajax的封装,以及利用jquery的ajax获取天气预报
1.Ajax的封装 function ajax(type,url,param,sync,datetype,callback){//第一个参数是获取数据的类型,第二个参数是传入open的url,第三个是 ...
- Drf(DjangoRestFramewok)
第一部分 问题 1.前后端分离? vue.js 后端给前段返回json数据 2.移动端盛行. app 后端给app返回json数据 3.PC端应用? crm项目,前段后端一起写,运行在浏览器上. 一般 ...