老生常谈Python基础之字符编码


Posted in Python onJune 14, 2017

前言

字符编码非常容易出问题,我们要牢记几句话:

1.用什么编码保存的,就要用什么编码打开

2.程序的执行,是先将文件读入内存中

3.unicode是父编码,只能encode解码成其他编码格式

utf-8,GBK这些是子8编码,只能decode编码成Unicode

一、什么是字符编码

我们知道,计算机只能识别二进制,我们平时写的代码都需要转成二进制才能被计算机识别。所以,我们写的字符怎么转换成二进制呢,这个过程实际就是通过一个标准使我们写的字符与特定数字一一对应,这个标准就称为字符编码。

字符------(字符编码)------->数字

二、字符编码发展历程

1.ASCII码

计算机起源于美国,字符编码也起源于美国。但是美国人民使用的文字只有26个字母,再加上些特殊符号就搞定了。不像我们中国,小学生就要认识几千个汉字。所以美国人民就使用了ASCII码(美国信息交换标准码)作为字符编码,一个Bytes代表一个字符,1Bytes=8bit,可以有2的8次方即256中不同的变化,但最初只用了前7位,即127个字符,已经足够美国人民使用了(当然也出于成本的考虑)。后来将拉丁文编入第8位,至此,ASCII码就被占满了,英语国家和拉丁国家可以愉快的玩耍了。

2.GBK

别看咱们中国暂时科技比不上美帝国,但是咱们有一颗积极向上的心啊,于是,在1980年,国家标准总局发布了中文使用的字符编码-->GBK,使用两个字节表示一个汉字,这样就有2的16次方即65536种组合,已经足够汉字使用了。

同时,其他国家也分别发布了自己国家的字符编码标准,如日本的shift_JIS,韩国的Euc-kr等等

3.Unicode

据说,字符编码鼎盛时期有数百种,且彼此间互相不支持,看来各国人民都很有骨气,但是这太不利于世界的互通了,于是Unicode应运而生。1994年,国际标准化组织发布了号称万国码的Unicode,用两个字节表示一个字符,有65536种组合,已经能把全世界绝大多数语言包括了。

4.utf-8

Unicode虽然好,但有一个问题,本来用一个字节就能表示的英文,现在要用两个字节,存储空间平白多出一倍,这显然是不完美的,所以又产生了utf-8,对英文字符只用1个字节,对中文字符用3个字节来表示。 

5.Unicode所有字符都是两个字节,简单粗暴,字符转换成数字的速度快,但是占用存储空间大

utf-8对不同的字符采用不用的长度表示,节省空间,但是转换效率不如Unicode快

内存中使用的字符编码是Unicode,内存就是为了加快速度的,所以宁肯牺牲一点空间,也要保证速度

硬盘和网络传输是用utf-8的,因为磁盘I/O或者网络I/O延迟要远大于utf-8的转换效率,并且在网络传输中应该尽可能节省带宽

三、Python解释器执行

第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器

第二阶段:python解释器作为文本编辑器,去打开t.py文件,从硬盘上将t.py的文件内容读入到内存中

第三阶段:python解释器解释执行刚刚加载到内存中t.py的代码

其中第二阶段,t.py文件在保存时有一个字符编码,在Python解释器打开文件时也要指定一样的编码方式(Python2默认的编码方式是ASCII,Python3默认是utf-8),如果文件保存的编码格式和Python解释器默认的编码方式不一样,就要在文件的开头写上#coding: ,来告诉python解释器不要用自己默认的编码方式来读,而是要用头文件指定的方式来读文件,这样才不会出错。

第三阶段:读取已经加载到内存中的代码(默认是Unicode),然后执行,执行过程中如果碰到类似定义变量的操作,就会在内存中开辟一块新的内存空间。此时注意,新开辟的内存空间不一定也是Unicode,用户可以在定义变量的时候指定编码方式,定义时开辟的内存空间,也只是一块空间而已,可以存放任意编码格式的代码。以Python3为例

老生常谈Python基础之字符编码

四、编码解码

保存文件是把内存中的文件保存到硬盘上

读文件是把硬盘中的文件读到内存

老生常谈Python基础之字符编码

Unicode是父编码,utf-8,GBK这些是子编码,如果子码想转换成其他编码,必须要先转换成父编码,再由父编码转换成其他子编码

解码就是decode,是由子码转成父码Unicode的过程

编码就是encode,是由Unicode转换成其他编码的过程

之前说过,文件读入内存中,就成了Unicode编码(当然这是默认情况,也可以根据指令更改),从硬盘读文件的过程就是把硬盘中的utf-8解码成Unicode

文件保存时,就是由内存保存到硬盘的过程,硬盘中是utf-8的编码方式,需要由Unicode编码成utf-8

五、Python2和Python3的区别

1.Python2的默认编码方式是ASCII,打开utf-8保存的文件时会报错,应该在头文件上加#coding : utf-8

Python2中的str被识别为Bytes,所以Python2中的str是被编码后的结果,其实会默认做一件事,就是在str前面加一个u,先转换成Unicode,在encode成bytes

Python2中有两种字符串类型,str和Unicode,str可以通过在前面加个‘u'来转换成Unicode

2.python 3 的默认编码方式是utf-8,可以直接打开用utf-8保存的文件

Python3中的str被识别成Unicode

Python3中也有两种字符串类型(bytes和str),但bytes就是bytes,str是unicode

六、打印到终端

首先要知道,Windows的终端的默认编码方式是GBK

终端也是应用程序,是运行在内存中的,所以我们用print()打印的过程,是从内存中到内存中。所以对于unicode,怎么打印都不会出错,但是Python2中除了加‘u'的字符串外,其他的字符串是Bytes,此时终端中是GBK编码,而Python2中是指定的utf-8或者默认的ascii码时,在终端中打印就会出错。

这些是我目前的理解,如果我以后意识到错误或者有表述不清的地方,再来修改。唉,字符编码是个坑啊

以上这篇老生常谈Python基础之字符编码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现简单的可逆加密程序实例
Mar 05 Python
Python判断字符串与大小写转换
Jun 08 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
新手如何发布Python项目开源包过程详解
Jul 11 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
Python生成并下载文件后端代码实例
Aug 31 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 #Python
Python之re操作方法(详解)
Jun 14 #Python
Python之py2exe打包工具详解
Jun 14 #Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 #Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 #Python
Python实现的下载网页源码功能示例
Jun 13 #Python
Python爬虫DOTA排行榜爬取实例(分享)
Jun 13 #Python
You might like
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
Yii2框架使用计划任务的方法
2016/05/25 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
JavaScript实现二叉树的先序、中序及后序遍历方法详解
2017/10/26 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python collections模块实例讲解
2014/04/07 Python
python开发之文件操作用法实例
2015/11/13 Python
安装Python和pygame及相应的环境变量配置(图文教程)
2017/06/04 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
python opencv实现gif图片分解的示例代码
2019/12/13 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
个人作风剖析材料
2014/02/02 职场文书
表决心的诗句大全
2014/03/11 职场文书
规范化管理年活动总结
2014/08/29 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
社区低保工作总结2015
2015/07/23 职场文书
优秀志愿者感言
2015/08/01 职场文书
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android