以Python2和Python3为例:
![1f83f1df2e57263980119bc624f262d6.png](https://i-blog.csdnimg.cn/blog_migrate/429e8d1d58b814d7ebd4e9ff2bdb0b8d.jpeg)
在说编码、解码的概念之前,我们先说一下,写代码和执行代码的区别.
以Python2实验
1. 写代码
如果我说,我们写的代码首先是以二进制01的形式存储在硬盘中的,你可能会认为我说的就是废话,不管是何种形式的编码规则(ASCII编码、GB2312编码、GBK编码、FB18030编码、UTF-8编码)对字符进行编码,最后在计算机硬盘中存放的形式都是01形式,关键是以什么样的方式(编码)变成二进制,如果你真的这样想,那么你是对的,哈哈.(注:后面都用十六进制来表示在硬盘和内存中的存放形式,这样比较容易观察.)
如果你用Pychram软件编写的Python代码,默认是以UTF-8编码形成的01形式存放在硬盘中,VS code亦是如此,如图2所示:
![669d074d67eeecab5eeeaa3824d14cd3.png](https://i-blog.csdnimg.cn/blog_migrate/fe9b3525e9ce39a82f9adebf9b55b906.jpeg)
2. 运行代码
那运行代码又是怎么回事呢?
![239be3251a07602e5f429712864a9d24.png](https://i-blog.csdnimg.cn/blog_migrate/5632513494c0cd18835b4ab9cad53ef1.jpeg)
前面我们说过,在用Pychram软件写Python代码是以UTF-8编码形成的01形式存储在硬盘,如果用Python2运行代码,就会将代码转换成ASCII码加载进内存,如果用Python3运行代码,就会将代码转换成Unicode的形式加载进内存.
我们利用python2来写一个实验:
a = 'hello'
print a
输出结果:hello
![a9fbcda0fec33222a412f3f54c4fae4b.png](https://i-blog.csdnimg.cn/blog_migrate/f49f827cb6a1b4932c6f608aeb3e8912.png)
通过Pychram运行代码没有任何问题,那么,这段代码从写到运行结束之后,到底发生了一个怎样的过程呢?
![c36d698c15263a68511982be0cbdeaae.png](https://i-blog.csdnimg.cn/blog_migrate/b66a61735a1f8060b205f901b917df91.png)
分析:如图5所示,"hello"字符串先以UTF-8码存储在硬盘中(这个编码规则是取决于编写代码的软件,这里用的是Pycharm),然后UTF-8码转换为ASCII码加载进内存(各种编码只要有对方的字符,都有一个转换公式,这个不要太过纠结,还有一点说明,UTF-8码是向下兼容ASCII码).
可能有人要问了,你怎么通过这个例子就能证明是转换成ASCII码加载进内存的呢?说的很好,确实不能证明,仔细观看图5就会发现,加载进内存中的编码与硬盘中的编码都是x68x656c6f,在内存中也完全有可能是UTF-8码,根本就没有发生变化.
既然如此,我们换个打印对象,换成'你好'这个字符串.
实验:
a = '你好'
print a
输出结果出错(SytaxError: Non-ASCII character 'xe4' in file...)