zoukankan      html  css  js  c++  java
  • 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存放
  • 相关阅读:
    linux学习
    linux学习--常用基本命令
    expect学习
    linux学习-cut,ssh keygen ,find
    expect
    告别痛苦,快乐学习Pandas!开源教程《Joyful-Pandas》发布
    iBooker 财务提升星球 2020.2~3 热门讨论
    计算机电子书 2020 CDNDrive 备份(预览版)
    poj2017
    poj2000
  • 原文地址:https://www.cnblogs.com/dongmengze/p/9470999.html
Copyright © 2011-2022 走看看