前言

以下内容来自网上&个人总结,如果有什么地方错误或者表达不准确欢迎指正。

三种编码

在python从文件到运行,总计能遇到三种编码。

  • 首先,.py文件有自己的编码方式,也就是这个文件是以什么编码方式保存在本地的。在windows下,python2默认是ASCII,python3默认是utf-8,这个可以用以下代码查看。
import sys
print(sys.getdefaultencoding())
  • 其次,.py在编译时要按计算机本身用的编码来编译,大部分的中文语言的计算机应该都是GB2312,这个编码方式可以在文件开头用
#coding = utf-8

这种方式来改变,只有这个编码和上面的文件编码一致时才不会导致乱码问题。

  • 最后,print这个函数有自己的编码方式,它与stdout的编码方式是一致的,具体请看参考文献[2],如果这个编码不一致的话,有可能会导致无法输出想要的东西

字符串编码

见下图

python 设置编码 python的编码_python


在python2中,字符串有str和unicode两种形式(这两种的区分并不明显,有时会引起混淆),而在python3中,变成了byte和str,这就导致了很多代码在其中一个python版本中能跑,但是在另一个版本就会报错,就是可能因为在python2中一个变量是str格式的,到python3后变成bytes格式了,然后函数就不认了,这时有两种处理方式:

  • 一种是使用encode和decode函数,这两个函数可以把其中一种转码为另外一种,具体如下表:

encode

decode

python2

unicode→str

str→unicode

python3

str→bytes

bytes→str

但是这种方法其实有点本末倒置的感觉,毕竟我们并不是真的想编码,只是想把python2和python3中变量类型调为一致。而且有时在编码时会报有的字节无法被编码的错误。

  • 在介绍另一种方法之前,要先介绍一下字符串前缀的四种形式:
  • 无前缀:单纯表示字符串str;
  • r前缀:r代表row string,也叫做原生字符串,字符串里面写啥就是啥,不进行转义字符;
  • b前缀:表示字符串是bytes类型,没错,也就是python3中的bytes;
  • u前缀:表示字符串以 Unicode 格式进行编码,有时中文会用到。

从上面前缀的介绍就可以知道,如果一个字符串在python2中作为str处理,那么只要在前面加上b前缀,就可以作为byte处理了。

最后,byte和str有很多函数和符号是通用的(比如+),最重要的一点是它们不能混用。所以只要明确它们的格式,在该用什么格式的时候就用特定的格式,就可以避免编码错误了。