python编码解码

1.起源

  • 计算机只能识别二进制,于是人类发明各种编码,能让计算机识别
  • 英语国家使用ASCII,能够存放英文和拉丁字母
  • 中国为了能存放汉字,创造了gb2312,随后又发展了gbk、gb18030
  • 万国码unicode,是全球通用的编码,utf-8是遵守unicode编码字符集的一种编码方式
  • 各国编码以及utf-8都只能和unicode进行编码解码
  • 在做各种编码转换之前,都必须要先解码为unicode

2.编码

  • 万国码转换为各国编码的过程,是编码,即encode

3.解码

  • 各国编码转换为统一的万国码的过程,是解码,即decode

 4.默认编码方式

  • python2 默认采用ASCII,通过在文件头部添加 # -*- coding: utf-8 -*- 可以修改默认编码方式
  • python3 默认采用unicode

5.python2举例:utf-8 转 gbk

  • 正确

    # -*- coding: utf-8 -*-

    s = "我是中文字符"

    s_to_unicode = s.decode("utf-8")

    unicode_to_gbk = s_to_unicode.encode("gbk")

  • 错误

    utf_to_gbk = s.encode("gbk")  #python2会默认先以ASCII解码,此时会报错

6.python2里字符只有两种类型

  • str类型:以十六进制的bytes编码方式把字符存放在内存中
    • # -*- coding: utf-8 -*-
      s = "我是中文字符"
      print type(s)
      print repr(s)
      
      输出:
      <type 'str'>
      'xe6x88x91xe6x98xafxe4xb8xadxe6x96x87xe5xadx97xe7xacxa6'
      
      # -*- coding: utf-8 -*-
      s = b"我是中文字符"
      print type(s)
      print repr(s)
      
      输出:
      <type 'str'>
      'xe6x88x91xe6x98xafxe4xb8xadxe6x96x87xe5xadx97xe7xacxa6'
      
  • unicode类型:以unicode编码方式把字符存放在内存中
    • # -*- coding: utf-8 -*-
      s = u"我是中文字符"
      print type(s)
      print repr(s)
      
      输出:
      <type 'unicode'>
      u'u6211u662fu4e2du6587u5b57u7b26'
      
  •  str和unicode的拼接
    • # -*- coding: utf-8 -*-
      s = u"i am word" + b"i am word"  #这就是python2的特点,它自动的将bytes以ASCII编码集解码成了unicode
      print type(s)
      print repr(s)
      
      输出:
      <type 'unicode'>
      u'i am wordi am word'
    • # -*- coding: utf-8 -*-
      s = u"我是中文字符" + b"我是中文字符"  #这一次python2自动将bytes解码成unicode时,由于中文不在ASCII编码集中,所以解码报错
      print type(s)
      print repr(s)
      
      报错:
      UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

7.python2的编码、解码转换图

  

8.python3的编码、解码转换图

2和3的区别:

  • python3里字符的两种类型是str和bytes
  • str类型是以unicode编码方式把字符存放在内存中
  • bytes类型是以bytes编码方式把字符存放在内存中
  • str和bytes拼接时,python3不会自动解码

 9.记住最重要的一点

  • python2中的str对象是以bytes存放,python3中的str对象是以unicode存放
原文地址:https://www.cnblogs.com/dongmengze/p/9470999.html