不论你是有着多年经验的 Python 老司机仍是刚入门 Python 不久,你必定遇到过UnicodeEncodeError
、UnicodeDecodeError
错误,每当遇到错误咱们就拿着 encode、decode 函数翻来覆去的转换,有时试着试着问题就解决了,有时候怎么试都没辙,只有借用 Google 大神帮忙,但彷佛不多去关心问题的本质是什么,下次遇到相似的问题重蹈覆辙,那么你有没有想过把 Python 字符编码给搞懂呢?python
彻底理解字符编码 与 Python 的渊源前,咱们有必要把一些基础概念弄清楚,虽然有些概念咱们天天都在接触甚至在使用它,但并不必定真正理解它。好比:字节、字符、字符集、字符码、字符编码。windows
字节网络
字节(Byte)是计算机中数据存储的基本单元,一字节等于一个8位的比特(8bit
),计算机中的全部数据,不管是保存在磁盘文件上的仍是网络上传输的数据(文字、图片、视频、音频文件)都是由字节组成的。函数
字符优化
你正在阅读的这篇文章就是由不少个字符(Character)构成的,字符一个信息单位,它是各类文字和符号的统称,好比一个英文字母是一个字符,一个汉字是一个字符,一个标点符号也是一个字符。编码
字符集操作系统
字符集(Character Set)就是某个范围内字符的集合,不一样的字符集规定了字符的个数,好比 **ASCII 字符集总共有128个字符**
,包含了英文字母、阿拉伯数字、标点符号和控制符。而 GB2312 字符集定义了7445个字符
,包含了绝大部分汉字字符。.net
字符码code
字符码(Code Point)指的是字符集中每一个字符的数字编号,例如 ASCII 字符集用 0-127 连续的128个数字分别表示128个字符,例如 "A" 的字符码编号就是65。orm
字符编码 一套法则, 可以将0/1和人类的语言之间进行转换的法则
字符编码(Character Encoding)是将字符集中的字符码映射为字节流的一种具体实现方案,常见的字符编码有 ASCII 编码、UTF-8 编码、GBK 编码等。某种意义上来讲,字符集与字符编码有种对应关系,例如 ASCII 字符集对应 有 ASCII 编码。ASCII 字符编码规定使用单字节中低位的7个比特去编码全部的字符。例如"A" 的编号是65,用单字节表示就是0×41,所以写入存储设备的时候就是b'01000001'。
文件的输入和输出是两个过程 人类输入的内容都是人类本身能够识别的字符 计算机只能识别0101010二进制字符 将人类的字符,存入内存和硬盘,要经历一个过程: 人类的字符 >>>>>>> (字符编码表) >>>> 计算机二进制 0 a 1 b 01 a 10 b 00 c 11 d
ASCII码表(美国)
八位二进制 = 8bit 8bit = 1bytes 1024bytes = 1KB 1024KB = 1MB 1024MB = 1GB 1024GB = 1TB 1024TB = 1PB
GBK(中国) 用2个bytes来表明一个字符,兼容英文字符 0000 0000 0000 0000 1111 1111 1111 1111 最多能够表示65535位
(unicode)
Unicode就是为了统一各国各地区的编码规则, 从新搞了一套包罗地球上全部文化, 符号的字符集! Unicode没有编码规则, 只是一套包含全世界符号的字符集. Unicode也不完美, 因而后续有了众多UTF编码(UTF-8, UTF-16)
总之搞清楚一件事情, 一个字符用了UTF-8
编码的, 就要用UTF-8
去解码, 否则就会出现乱码.
unicode
全部的字符都用2bytes
io
次数增长,程序运行速度变慢(最致命)在unicode
二进制数据存入硬盘的时候,作优化
utf-8:
utf-8
只与unicode
有对应关系
unicode transformation format
全部的英文字符用1个bytes表示
全部的中文字符用3个bytes表示
如今的计算机:
内存都是:unicode
硬盘都是:utf-8
须要掌握: 一、用户不管输入什么字符,存入内存,unicode均可以兼容 二、硬盘中不管是什么编码的文件,读到内存,均可以兼容unicode
数据的传输:
优先以本身的本国字符编码进行传递
必须掌握()
(内存)unicode二进制字符 >>> 编码(encode) >>> (硬盘)utf-8二进制字符
(硬盘)utf-8二进制字符 >>> 解码(decode) >>> (内存)unicode二进制字符****
保证不乱码核心: 用什么编码存的数据,就用什么编码取 python2 : 默认的字符编码ascii码(由于当时的unicode还没盛行) python3: 默认的字符编码utf-8 文件头: # coding:utf-8 用英文字符,是为了让全部的计算机均可以识别
pycharm默认的字符编码是: utf-8 windows操做系统默认字符编码: gbk