Python入门之字符编码
一、字节编码的基础知识
一、计算机基础知识
#1 我们的程序都是运行在特定的操作系统内,例如window,linux,mac等等
#2 运行应用程序,需要要操作系统发出请求,我们双击运行的时候会向操作系统提供应用程序的路径
#3 操作系统根据提供的路径,向磁盘寻找此应用程序,然后把该应用程序加载到内存中,到达内存后,程序代码就会进入CPU。
#4 应用程序的操作都需要向操作系统发起系统调用,然后由操作系统进行相关的硬件操作

二、计算机存取文件的过程(以巨硬公司的word编辑器为例)
#Stage1 当我们打开word程序,我们就启动了一个word的进程,这时word创建的文档是暂时存在内存中的,如果不及时保存,很容易丢失
#Stage2 当我们完成文档内容,点击保存,这时word的文档的内容就会会从内存存到硬盘中
#Stage3 内存中的数据断电后,就消失了,但是数据写入硬盘之后,即使断电,仍然在。

三、Python解释器执行py文件的原理(以执行hello.py为例)
#Stage 1:python解释器启动,此时相当于上一步启动了word编辑器
#Stage 2:python解释器相当于文本编辑器,当我们要运行hello.py文件,操作系统会从硬盘上将hello.py的文件内容读入到内存中
#Stage 3:python解释器解释执行刚刚加载到内存中hello.py的代码
** 无论是从内存储存到硬盘,还是从硬盘加载到内存准备给CPU运行,相互传输的都是硬件层面的010101010101机器码,硬件层面的都是由操作系统执行的**
二、字节编码的介绍
一、什么是字节编码
我们都知道计算机是机器,机器之间的通讯会使用机器特定的语言,沟通的方式和人类社会一样,有着特定的规则和方式。计算机遵循二进制原理,采用电平高低分别对应二进制中的0和1,磁盘比较特殊,采用磁极的正负极代替1和0。
对于我们一般来说,使用计算机都是图形和文字界面,都是人类可以直接看懂的。但是人类和计算机交流,是通过工具转换成0101,让计算机懂人类的语言。
这个流程,一般来说和翻译一样,人类的字节--->>>通过各种输入设备翻译--->>>计算机能够懂的2进制01010。 ***这个翻译过程就是人类的字节,对应计算机特定的数字,这个过程我们称之为字节编码。***
二、Python运行过程中过涉及的字节编码
#1 我们Python编程留存的.py文件都是由英文或者中文字节组成,
请仔细查看pycharm右下角,我们的.py文件都是按照特定的编码格式保存起来的,见下图,我们使用的是UTF-8编码
#2 Python中的数据类型String字节串,都是由字节组成的,
当我们运行时,String字节串会按照.py文件存档的格式(UTF-8)依次转换为Unicode,变成了机器可以识别的01010101指令。


三、 字节编码的发展历史和分类

计算机最早是由使用英语的的美国人发明的,美国人为了方便了计算机沟通,创建了最初的人机交互翻译用的字节编码表ASCII,规定了ASCII表中特殊数字与26个英语字母,0-9阿拉伯数字,标点符号和一些特殊字节的一一对应关系。计算机刚刚开始的时候,最多只能用8个2进制的数来表示一个字节,就是我们说的8bit(s)=1Byte

请看上图,有8个bits组成了一个1Byte,我们知道1bit只有两个状态,要么是0,要么是1,但是要是他们8个合在一起,能有多少变化呢?根据我们所学的数学知识,应该是2x2x2x2x2x2x2x2,即2的8次方,一共有256种不同的状态,所以说ASCII码最多只能表示为256个字节。
在英语的世界,256种特殊字节,足以覆盖英语的各种字节,再用字节组成单词,单词再组成句子,让人们能够和计算机无障碍的交流。
但是随着全球化的发展和科学技术的传播,地球上讲“非英语”的国家和人民也需要使用计算机,各个国家根据自己的语言,仿照美国人创建ASCII的方法,把本国语言的字节分别对应特殊的数字。
拿中文举例,我们国家指定的标准是gb2312编码,规定了中文中的各个汉字和特殊数字一一对应的关系。
但是中文博大精深,汉字个数比较多,2的8次方256种变化,根本无法覆盖所有的中文字节。所以我们采用了2个字节(2 Bytes = 8bits + 8bits)来表示一个汉字,总共使用了16bits。2的16次方是65536,那就是说gb2312编码表可以对应65536个汉字,我们日常汉字也就三千多个,gb2312编码足够我们使用。
同理,日本指定的是Shift_JIS编码,韩国人使用的是Euc-kr编码。
但是结合实际使用,我们的文档中不止中文字节,有时候会有英文字节,日文字节或者韩文字节。那么这篇文档,无论按照哪国的标准,都会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字节跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)
这时候问题出现了,精通18国语言的小周同学谦虚的用8国语言写了一篇文档,那么这篇文档,按照哪国的标准,都会出现乱码(因为此刻的各种标准都只是规定了自己国家的文字在内的字节跟数字的对应关系,如果单纯采用一种国家的编码格式,那么其余国家语言的文字在解析时就会出现乱码)
所以迫切需要一个世界的标准(能包含全世界的语言)于是unicode应运而生
ASCII用1个字节(8位二进制)代表一个字节
unicode常用2个字节(16位二进制)代表一个字节,生僻字需要用4个字节
例:
字母“x”,用ascii表示是十进制的120,二进制0111 1000
汉字“中”已经超出了ASCII编码的范围,用Unicode编码是十进制的20013,二进制的01001110 00101101。
字母”x“,用unicode表示二进制0000 0000 0111 1000,所以unicode兼容ascii,也兼容万国,是世界的标准
这时候乱码问题消失了,所有的文档我们都使用。但是新问题也出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上效率也低。
本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字节根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字节才会被编码成4-6个字节。如果你要传输的文本包含大量英文字节,用UTF-8编码就能节省空间:
| 字节 | ASCII | Unicode | UTF-8 |
|---|---|---|---|
| A | 01000001 | 00000000 01000001 | 01000001 |
| 中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
从上面的表格还可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分,所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
如下是基本编码的种类和情况:
ASCII 占1个字节 只支持英文
GB2312 占2个字节 只支持6700+汉字
GBK 占2个字节 支持21000+汉字 GB2312的升级
Shift-JS 日本字符字节
ks_c_5601-1987 韩国编码
TIS-620 泰国编码
由于每个国家都有自己的编码,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在国家和地域局限性,仅涵盖本国字符,无法和他国字符形成对应关系。
这时候该Unicode出马了!-----“我Unicode不是针对某个编码,我是说地球上所有的国家编码都是辣鸡!”
Unicode占用2-4个字符,已经收录了136690个字符,并且在一直扩张中。
Unicode起到了两个作用:
1. 直接支持全球所有语言,全球各个国家的编码表可以丢掉了。
2. Unicode包含了全球所有国家编码的映射关系。
Unicode解决了字符和二进制的对应关系,但是使用Unicode表示一个字符,太浪费空间了。
在Python中,字符串是按unicode处理的,因为现在计算机的内存都超大,区区字符串可以轻松解决。
但是在网络传输和硬盘储存中,数据量增加1-3倍是无法容忍的。
为了解决储存和网络传输的问题,出现了UTF-8,对unicode进行转换压缩,以便节省硬盘储存和网络传输的空间。
1. UTF-8 使用1-4个字节动态表示所有字符;优先使用一个字符,如果无法满足就增加一个字符。其中英文占1个字符,欧洲语系占2个字符,东亚占3个字符,其他特殊字符占4个。
2. UTF-16 使用2或4个字节表示所有字符,优先使用2个字符,不够就用4个字符。
3 UTF-32 统一使用4个字节表示所有字符
总结: UTF是Unicode编码的一种在储存和网络传输中节省空间的编码方案
Unicode包含了跟全球所有国家编码的映射关系,你可以在Unicode编码表中找到全球任何国家的任何二进制对应的文字;
无论你法语,英文,汉语的软件,加载到内存中统统都是Unicode的格式。
四、Python3的执行过程中的编码
在Python3种执行代码的过程:
1. 解释器找到代码文件,把代码字符串按照文件定义的编码加载到内存,转成unicode;
2. 把代码字符串按照语法规则进行解释
3. 所有的变量字符都会一unicode的编码声明
但是在Python2中,它的默认编码不是unicode,而是ASCII。。。
为什么呢,因为unicode是从1994年才出生,而python作者鬼畜,在1989年就开始造出了Python。
unicode是晚辈啊,没办法,先用祖先ASCII编码吧,直到Python3,unicode晚辈才取代了ASCII。
Python2中有专门的unocide类型,作为区分和ASCII祖先区分;
unicode和各种字符的关系如下,unicode到字符串是编码,字符串到unicode是解码。

五、Python中的bytes类型
bytes是字节类型,它把8个bits组成一个byte,把2进制的形式转化成16进制表示,这个转换只是让人类更加好读罢了。
Python2中的字符串更应该被叫做字节串,bytes == str,而Python3中是unicode == str。
Python中特有的Unicode类型,通过解码后,会变为unicode。
Python3中把字符串str规定为unocide,文件的默认编码是utf-8。
Pyhton3中除了把字符串的编码改成unicode,还把str和byte做了区别,str就是unicode格式的字符串,bytes是单纯的二进制字符。
Python入门之字符编码的更多相关文章
- Python入门基础--字符编码与文件处理
字符编码 文本编辑器存取文件的原理 #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失 #2.要想永久保存,需要点击保存按钮:编辑器把内 ...
- python基础_字符编码
字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...
- 第1章 Python基础之字符编码
阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...
- 永久修改python默认的字符编码为utf-8
这个修改说来简单,其实不同的系统,修改起来还真不一样.下面来罗列下3中情况 首先所有修改的动作都是要创建一个叫 sitecustomize.py的文件,为什么要创建这个文件呢,是因为python在启动 ...
- Python基础之字符编码
前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf ...
- python 基础之字符编码和文件处理
一.字符编码 (1)计算机基础知识 (2)python 解释器执行py文件的原理 <1>python 解释器启动 <2>python解释器相当于一个文本编辑器,打开txt.py ...
- Python系列之 - 字符编码问题
1.内存和硬盘都是用来存储的. CPU:速度快 硬盘:永久保存 2.文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就可以启动一个进程,是在内存中的,所以在编辑器编 ...
- 07-Python入门学习-字符编码与文件处理
字符编码 人操作计算机使用人类认识的字符,而计算机存放都是二进制数字所以人在往计算机里输入内容的时候,必然发生: 人类的字符------(字符编码表)-------->数字 比如我输入一个‘上’ ...
- (Python基础)字符编码与转码
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...
随机推荐
- Ubuntu16.04 安装lamp环境
拿到新装的ubuntu16.04新系统 首先 apt-get update 更新一下 我这里是root用户,如果您不是超级管理员,命令前加sudo即可 如果您加了sudo也不好使,那就联系管理员,给你 ...
- 地址转换函数:inet_aton & inet_ntoa & inet_addr和inet_pton & inet_ntop
在Unix网络编程中,我们常用到地址转换函数,它将ASCII字符串(如"206.62.226.33")与网络字节序的二进制值(这个值保存在套接口地址结构中)间进行地址的转换. 1. ...
- ELK之生产日志收集构架(filebeat-logstash-redis-logstash-elasticsearch-kibana)
本次构架图如下 说明: 1,前端服务器只启动轻量级日志收集工具filebeat(不需要JDK环境) 2,收集的日志不进过处理直接发送到redis消息队列 3,redis消息队列只是暂时存储日志数据,不 ...
- Centos6.10安装tomcat
1. 下载tomcat 2. 解压到相应的路径下 tar -xzvf apache-tomcat-8.5.34.tar.gz 3. 启动tomcat # 进入"apache-tomca ...
- split和strip的使用
我觉得都可以进行分隔,但最大的不同就是一个返回list,一个返回字符串 s1 = 'deng ye xun' s1.split() Out[8]: ['deng', 'ye', 'xun'] s1.s ...
- POJ - 1101 The Game dfs
题意:给你一个地图,上面有一些‘X',给你起点终点,让你输出从起点到终点的路径中转向(改变方向)次数最少的路径,注意,不能穿过别的’X'并且可以超过边界 题解:关于超过边界,只要在外围多加一圈‘ ’. ...
- html 复制 有时不显示样式
是因为有中文的空格 /**HTML**/ div.ani /**css**/ .ani{ width:480px; height:320px; margin:50px auto; overflow: ...
- es fielddata理解
在es中,text类型的字段使用一种叫做fielddata的查询时内存数据结构.当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建.它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在j ...
- 走进APICloud的世界 (1)
APICloud是什么东东?它是一个云端一体平台.啥意思?它利用HTML5跨平台技术同时满足android和ios的APP开发.相比APP传统开发而言,节约了不少成本,而且性能还可以和原生APP性能比 ...
- 人活着系列之芳姐和芳姐的猪(Floyd)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2929 这个题一方面数据水,另一方面就是思维水, ...