虽然这是一个很基础的问题,但是博主一直都是瞎猫碰死耗子的心态去试,因为对于中文就那么几种encode方式 - -!
编码解码
- 什么是
encode
和decode
一般来说由一种字符串变成二进制串的过程叫encode;反之称为decode
- 从保存文档开始讲起
通常我们写一个文档时,无论是通过word / pycharm / notepad++这些,都会有一个东西叫解码方式,出现在右下角,并且选不好就出现乱码。
why?
首先,我们知道字符串存在硬盘中,实际上存放的是二进制数,那怎么存放二进制数,二进制怎么对应起我们想要的字符,这就通过了我们规定的编码规则了。
我们通过输入法,输入的字符串到硬盘二进制的过程叫encode;打开二进制文件在编辑器中显示字符的过程叫decode。
这是对于文件编辑器来说。
python3字符
python3文件中只有两种字符str
型和bytes
型
其中bytes
就是二进制串的十六进制表示,str
在python3是Unicode
标准并且可以选择不同编码表示,如utf-
GBK
ISO-
等。
可以在python代码的首行指定# -*- coding:gbk -*-
,或者在pycharm的右下角选择
关于Unicode
这些,可以看:https://blog.youkuaiyun.com/qq_24326765/article/details/82183167
其实你把python文件当成一个普通的字符文件就很容易理解上面的东西了。
只不过python因为可以调用函数实现encode和decode的操作。
看看python3如何指定解码方式读取文档
特地用GBK
写了一个test文件,只有一行:
i love 中国!
代码:
# -*- coding:gbk -*-
a = 'i love 中国!'
print(a.encode('gbk'))
print(a.encode('utf-8'))
with open('test_en_decode','rb') as f:
a = f.readlines()
print(a)
print(a[0].decode('gbk'))
结果:
b'i love \xd6\xd0\xb9\xfa!'
b'i love \xe4\xb8\xad\xe5\x9b\xbd!'
[b'i love \xd6\xd0\xb9\xfa!']
i love 中国!
发现GBK
utf-
两者编码方式不一样,得到的二进制串结果也不一样。
并且'rb'
方式open最后得到得结果也可以进行对应编码方式得decode,而不出现乱码。
至于为什么python在encode后,英文字符不是二进制串,应该是编译器打印时,ASCII能对应得就转换了
.#