一、编码的种类情况
- ASCII 占1个字节,只支持英文
- GB2312 占2个字节,支持6700+汉字
- GBK GB2312的升级版,支持21000+汉字
- Shift-JIS 日本字符
- ks_c_5601-1987 韩国编码
- TIS-620 泰国编码
- Unicode 2-4字节
- Unicode Transformation Format(UTF)1-4字节
二、 Unicode 与 UFT
由于每个国家都有自己的编码规则,其仅涵盖本国字符,无其他国家字符的对应关系,所以Unicode(万国码)应运而生,它涵盖了全球所有的文字和二进制的对应关系。
Unicode 起到2个作用:
- 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
- unicode包含了跟全球所有国家编码的映射关系。
但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍,为了解决存储和网络传输的问题,UTF便诞生了。
- UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。
- UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
- UTF-32: 使用4个字节表示所有字符
所以总的来说,UTF 是为unicode编码设计的一种在存储 和传输时节省空间的编码方案。
三、字符怎么存到硬盘上的?
答:是按某种编码转换为二进制存储在硬盘上的。
在此需要注意的是:以何种编码存到硬盘上,再从硬盘读取出来时,就必须以何种编码读,否则乱码就出现了。
四、编码转换
先来看看python3 执行代码的过程:
- 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
- 把代码字符串按照语法规则进行解释
- 所有的变量字符都会以unicode编码声明
我们知道,当你将一个以utf-8编码的程序拿到自己的Windows系统上运行,也是会乱码的,因为只有2种情况 ,你的windows上显示才不会乱:
- 字符串以GBK格式显示
- 字符串是unicode编码
当你的程序是GBK编码时,拿到国外的电脑上使用是会乱码的,因为人家根本不支持中文呀,那么怎么办呢,你有如下办法:
- 让美国人的电脑上都装上gbk编码
- 把你的软件编码以utf-8编码
>>可是以上两条路似乎都不好走啊,那该怎么办哩??
>>不要着急,山人自有妙计。你找一个既懂美国语言的,又懂中文的翻译官不就得了么!
>>这个翻译官是谁呢?
>>Unicode呀!
是的,前面不是讲了,unicode支持全球所有语言,而且包含了跟全球所有国家编码的映射关系,所有系统、编程语言都默认支持unicode,所以可以把它作为一个转换器(翻译官),实现不同编码规则之间的转换。
具体方法就是,decode(解码) 和encode(编码),具体步骤如图:
代码(py3下运行):
s = "好好学习" print(type(s)) # 打印字符串类型 s1 = s.encode("gbk") # 编码 print(s1, type(s1)) s2 = s1.decode("gbk") # 解码 print(s2, type(s2))
运行结果:
<class 'str'> b'xbaxc3xbaxc3xd1xa7xcfxb0' <class 'bytes'> 好好学习 <class 'str'>
当然,Python2并不会自动的把文件编码转为unicode存在内存里, 那就只能你自己人肉转。Py3 会自动把文件编码转为unicode存入内存。
五、Python3与Python2的编码区别
Python3:
1、文件默认编码是utf-8;
2、字符串编码是unicode;
3、py3将str和bytes做了明确区分,str就是Unicode格式的字符串,bytes就是单纯的二进制。
Python2:
1、文件默认编码是ASCII;
2、字符串编码是ASCII(如果文件头申明了gbk、utf-8等编码形式,则字符串的编码就是gbk、utf-8等格式);
3、在py2中unicode是一种单独的类型,使用是需要单独申明,如:s = u"美丽”;
4、在py2中,str和bytes两种类型界限比较模糊,可以说str就是bytes,bytes就是str。
python中常用bytes表示图片、视频等在编码规范中找不到对应字符串的二进制数据。