说起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. USB小白学习之路(6) IIC EEPROM读取解析

    IIC EEPROM读取解析 1. 编译错误处理(这里可以忽略) 在解压包解压了程序后,直接编译,出现如下错误. *** WARNING L14: INCOMPATIBLE MEMORY MODEL ...

  2. Matplotlib数据可视化(3):文本与轴

      在一幅图表中,文本.坐标轴和图像的是信息传递的核心,对着三者的设置是作图这最为关心的内容,在上一篇博客中虽然列举了一些设置方法,但没有进行深入介绍,本文以围绕如何对文本和坐标轴进行设置展开(对图像 ...

  3. 分布式系统一致性问题与Raft算法(下)

    上一篇讲述了什么是分布式一致性问题,以及它难在哪里,liveness和satefy问题,和FLP impossibility定理.有兴趣的童鞋可以看看分布式系统一致性问题与Raft算法(上). 这一节 ...

  4. android通过NFC开启/关闭NTAG213的密码保护功能

    穷遍全网没有资料,最后找到了官方的寄存器文档和StackOverflow上找到了解决方案 首先要用 MifareUltralight 来进行操作,在onNewIntent处先校验返回的tag是否包含了 ...

  5. Qt_QChart的使用记录(小白)

    主要是记录柱状图的数值显示,散点图的点坐标显示(防止后续忘记,把文件都贴出来,方便复查) 资源库: WarehouseInputOrOutput.pro QT += core gui QT += ch ...

  6. [译]介绍一下渐进式 Web App(即时加载) - Part 2

    在上一篇,介绍一下渐进式 Web App(离线) - Part 1的文章中,我们讨论了典型的pwa应该是什么样子的并且同时也介绍了 server worker.到目前为止,我们已经缓存了应用壳.在 i ...

  7. http相关知识点回顾

    一.概述 1.什么是HTTP HTTP是一种可以获取HTML这样的网络资源的一种通讯协议protocol.是在WEB上进行数据交换的基础,是一种客户端--服务器协议.HTTP是一种可扩展的应用层协议, ...

  8. 一起了解 .Net Foundation 项目 No.16

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Orchard CMS O ...

  9. AX2012 form displays unusually because of native resolution issues(由于本机高分辨率问题导致AX2012界面显示异常)

    Please tick the 'Disable display scaling on high DPI settings' and re-logiin AX,it will be OK. 当你遇到本 ...

  10. celery异步任务 定时任务

    以前项目中用到过 celery ,但是没怎么记笔记,现在在记一下,方便以后用.   Celery.png 问:Celery 是什么? 答:Celery 是一个由 Python 编写的简单.灵活.可靠的 ...