字符编码

字符编码

概念

  • 我们平时看到的字符比如英文、中文等这些符号是比较浅显易懂的,但是计算机只认识0和1,那么如何将这些符号转换成由0和1组成的二进制编码并保存在硬盘中呢?这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准就称为字符编码

发展史

  • 计算机由美国人发明,最早的字符编码为ASCII,只规定了英文字母数字和一些特殊字符与数字的对应关系,最多只能用 8 位来表示(一个字节),即:2**8 = 256,所以,ASCII码最多只能表示 256 个符号
  • 中国人规定了自己的标准gb2312编码
  • 日本人规定了自己的Shift_JIS编码
  • 韩国人规定了自己的Euc-kr编码
  • 为了能够统一世界各国的编码格式,于是产生了unicode编码,与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码。unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用4个字节
  • 关于Unicode,可在这个网站查到所有字符: https://unicode-table.com/en/
  • 为了节约空间,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间
  • 内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性

编程中涉及到字符编码的场景

  • 一个python文件中的内容是由一堆字符组成的,python解释器读取和存储文件时均涉及到字符编码问题
  • 由于python源代码也是一个文本文件,所以当你的源代码中包含中文的时候,在保存源代码时,就需要指定保存为UTF-8编码。当python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上两行
  #!/usr/bin/env python3
  # -*- coding: utf-8 -*-

  #第一行是为了告诉linux/os x系统这是一个python可执行程序,windows系统会忽略这个注释
  #第二行是为了告诉python解释器,按照utf-8编码读取源代码,否则当源代码中有中文的时候输出可能会乱码
  #也可写作:'#coding=utf-8'
  • python中的数据类型字符串是由一串字符组成的。python解释器执行代码时,遇到比如name='lily'这样的,会开辟新的内存空间存放'lily'。在python3中,str类型会以unicode形式保存在新的内存空间中,因此str字符串类型可以直接encode成任意编码格式
x='上'
print(type(x))              #<class 'str'>
print(x.encode('gbk'))      #b'xc9xcf'
print(type(x.encode('gbk'))) #<class 'bytes'>

encode()和decode()

  • 在python中,在内存中写的所有字符,一视同仁,都是unicode编码。
  • 由unicode转换为其他编码格式称为编码--->encode
  • 由其他编码方式转换为unicode方式为解码--->decode
  name = '小明'
  print(name, type(name))  # str对象以unicode存储

  g_name = name.encode('gb2312')  # 以gb2312编码对name进行编码
  print(g_name, type(g_name))  # b'xd0xa1xc3xf7' <class 'bytes'>
  
  u_name = g_name.decode('gb2312')  # 以gb2312编码对bytes类型进行解码,获得字符串类型对象
  print(u_name, type(u_name))  # 小明  <class 'str'>
原文地址:https://www.cnblogs.com/iamluoli/p/11268957.html