python2和python3中encoding的差别

1.写在前面的话

  • 对于一些python库,比如:requests,会用到编码和解码(requests.utils.get_encodings_from_content()),还记得写在python文件最前面的#-*- coding:utf-8 -*-吗?
  • 编码和解码的目的是什么呢?
  • 对于不同的python版本,应该采用怎样的编码解码方法呢?

2.编码方式

  • ASCII
    • ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符
    • 如果要处理中文,ASCII码所能产生的组合数明显力不从心
  • Unicode
    • 用统一的一套编码规则来对不同语言字符进行编码,从而解决不同语言之间的乱码问题
  • UTF-8
    • Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,而UTF-8就是一种广泛使用的Unicode实现方式(也就是将某个字符根据Unicode字符集所对应的二进制代码编码成真正的字节码),所谓的字节码就是机器能读懂的二进制码(8个二进制位构成一个自字节),对应的字符码就是我们平时看到的字符(比如:‘A’)

3.Python2/3的不同编码方式

  • 先来看一个整体的编码解码流程吧(python中)

    备注:这是转载的图片
  • 通过sys.getdefaultencoding()查询python2/3的编码方式
    • Python2的编码方式是ascii,所以如果在文件开头没有加#-*- coding:utf-8 -*-的话,在解码过程中是会报错的,当然了也可以使用如下代码:
      import sys
      reload(sys)
      sys.setdefaultencoding('utf-8')
      
    • Python3的编码方式是utf-8,所以在绝大多数情况下是不会有中文解码问题的,但是在windows下仍然会有问题,因为文件是以 GKB编码方式存储的,所以python3解释器在解码的时候也会报错
  • 在python2中,存在三种字符串类:
    • basestring这个是母类
    • str这个是子类,是由unicode编码得到的字节串,严格说不是字符串
    • unicode这个也是子类,这个是字符串
  • 在python3中,存在两种字符串类,用于区分字符串和字节:
    • bytes 这个是字节
    • str这个是字符串,与python2是不同的哦

猜你喜欢

转载自blog.csdn.net/qq_37285386/article/details/107721224
今日推荐