字符编码

字符编码

不论你是有着多年经验的 Python 老司机仍是刚入门 Python 不久,你必定遇到过UnicodeEncodeErrorUnicodeDecodeError 错误,每当遇到错误咱们就拿着 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'。

ASCLL对照表

文件的输入和输出是两个过程

人类输入的内容都是人类本身能够识别的字符

计算机只能识别0101010二进制字符

将人类的字符,存入内存和硬盘,要经历一个过程:

人类的字符  >>>>>>>     (字符编码表)    >>>> 计算机二进制

0 a
1 b
01 a
10 b
00 c
11 d

ASCII码表(美国)

  • 用八位二进制来表明一个英文字符(全部的英文字符+符号一共大概128左右)
    0000 0000
    1111 1111
    最多只能表示255位
八位二进制 = 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
    0101 0101 a
    0000 0000 0101 0101 a
    一、占用存储空间
    二、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
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息