5. UTF-8编码
看完上面的UNICODE编码,大家是不是想编码问题已经解决了呢?既然UNICODE能够兼容所有已知的语言和文字,那就全部按照UNICODE来编码就行了呗 。如果你这样想的话,就too young too native了 。由于UNICODE实际上是使用更多的字节来保存除英文外的其他国家的复杂语言文字,所以对于中文字符这样的文字是非常合适的 。比如,中文汉字的“中”字,用UNICODE编码两个字节就可以这样表示:01001110 00101101,这样一点问题都没有 。但如果是英文字母呢?本来英文字母只需要一个字节就可以表示,比如大写字母A,用二进制表示为0100 0001,而用UNICODE的话,就必须用0来补足多出来的一个字节,即表示为00000000 01000001 。大家看出问题所在了吗?对了,对于英文来说,UNICODE编码太浪费空间了,足足大了一倍的空间 。特别是在网络上进行传输时,这种浪费就极其明显,会大大降低我们的传输效率 。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Unicode Transformation Format) 。而我们最常用的UTF-8就是这些转换格式中的一种 。UTF-8编码其实是一种可“变长”的编码格式,即把英文变长为1个字节,而汉字用3个字节表示,特别生僻的还会变成4-6字节 。所以如果是传输或存储大量英文的话,UTF编码格式优势非常明显 。
6. 不同编码格式和UNICODE之间的转换
为了在不同的编码格式之间进行转换,我们必须对字符进行编码和解码的工作 。任何非UNICODE格式的字符(串),我们都可以使用decode方法将其解码为UNICODE编码的字符(串),这种转换过程叫“解码” 。同样道理,UNICODE格式的字符(串),也可以通过encode()方法将其编码为其他编码格式的字符(串),这个过程叫“编码” 。后面我们会频繁使用到编码和解码的操作,大家都应该明白什么时候应该使用编码,什么时候应该解码 。
文章插图
到此为此,大家应该对编码类型有一定了解了,总结一下就是:
1.为了处理英文字符,产生了ASCII码 。
2.为了处理中文字符,产生了GB2312 。
3.为了处理各国字符,产生了Unicode 。
【一文搞懂Python字符编码问题,值得收藏】4.为了提高Unicode存储和传输性能,产生了UTF-8,它是Unicode的一种实现形式 。
二、运行环境的影响
搞清楚了上面介绍的各种编码格式之后,接下来我们就开始详细讲解为什么会出现乱码了 。关于乱码,大家记住两个要点:
(1)所谓乱码的本质是字符的编码格式与显示字符的环境编码格式不一致引起的 。这句话告诉我们要解决乱码问题,我们需要知道两个信息,一个是字符本身是什么编码,另一个就是显示字符的环境编码是什么,两者必须一致,才能显示出正确的内容 。
(2)由于Unicode编码是标准编码格式,也可以看做是没有任何特定编码格式的“无编码”模式 。所以,对于任何Unicode类型编码的字符,打印时python会自动根据环境编码转为特定编码后再显示 。
上面两个要点大家一定要记住,接下来,我们来看看字符在python代码中是怎么被编码的 。在不同的python版本中,字符编码的方式也不一样 。先来说说比较麻烦的py2版本 。如果你用py2来写脚本的话,因为默认py2是用ascii来编码脚本的,所以如果你的脚本中出现了中文,就必须在脚本的开始位置注明支持中文的编码格式,否则会报错 。所有支持中文的编码格式都是可以的,比如声明为#coding:utf8或#coding:gbk都是可以的 。注明以后,我们就可以在脚本中随意使用中文了 。例如下面这个例子:
文章插图
声明编码格式#coding:utf8或#coding:gbk以后可以正常工作 。如下:
文章插图
在py2中,所有字符串的编码方式默认是用ascii来进行编码的,如果通过coding:xxx的方式声明了脚本的编码方式,则字符串会按照声明的字符编码格式来进行编码,而字符串变量类型是为str类型的 。这里大家要记住py2中str一定是有特定编码的,不是Unicode格式(这里为什么要讲这一句,因为待会介绍的py3字符串默认是Unicode编码的,待会我们会细讲) 。比如上面的a变量中保存的“中国”这两个中文字符的编码就是gbk格式了 。那么当我们打印这个a变量的时候,会出现什么情况呢?我们现在IDE中打印来看看,比如pycharm,打印出来结果如下 。纳尼?居然出现了乱码,这是为什么呢?
推荐阅读
- 柚子教大家如何用python做精美的照片墙!五分钟学会get新技能
- 优化Python代码的4种方法
- 如何通过“import”语句确定在Python中导入了哪个文件?详解
- python脚本实现音频m4a格式转成MP3格式
- 一文搞懂 PHP 数组的真正用法
- 一篇文章教你搞定脚本监控
- 一文读懂,“算法”究竟是个啥?
- 看了这一文,你可以彻底认识锂电池的使用了
- 一个非常简单的 Python IPTV 客户端
- Python中的条件判断、循环以及循环的终止