python2.7显示中文内容乱码?几招教你拜托困境!

avatar 2018年8月14日18:16:49 评论 2,645

加入VIP,可以享受无广告视频播放!更可享受教程提前看!详情猛戳:VIP介绍

相信学习python的同学或多或少都经历过中文乱码的窘境,最近我在弄一些python的脚本的时候也遇到了这样的难题。以我安装的python2.7版本为例,来给大家讲讲中文输入如何不乱码的来龙去脉。

 

首先我们来谈一谈编码这个东西,由于计算机是美国人发明的,最早的编码里面仅仅有数字字母以及一些符号,不包含中文汉字,这个编码表我们常称为ASCII码表。

而要处理中文的时候,原来的ASCII码表就不够用了,需要使用两个字节来保存一个汉字,于是中国制定了GB2312编码,不会与原来的ASCII码表冲突,又可以用来表示中文汉字。但中国会把汉字弄成GB2312编码(也可以叫GBK编码),其他国家比如韩国会把韩文弄一个编码集,日本会弄一个日文编码集,因此在多语种文本中,这样的编码就势必会造成编码冲突,显示出来的时候,呈现出所谓的乱码。

因此,Unicode编码诞生了,这种编码可以把所有的语言都放到一种编码之中,这样就不会有乱码出现了。默认来讲,Unicode编码占用2个字节(一些偏僻文字可能占用4个),Ascii码占用一个字节。如果都用Unicode编码来写文件,那乱码肯定消失了,但你会发现,如果你的文件绝大多数文字都是一些ascii码可以覆盖的内容的话,使用Unicode的编码就会极大的占用空间了。

因此,又发明了可变长编码“UTF8”(或utf-8)。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

大概的知识就是这样,因此我们总结出了现在常见的ASCII,Unicode,utf-8三种编码。

由于python比unicode的诞生还要早,因此最早的python只支持ascii码,而后来的版本python加入了unicode的支持。

>>> print u'我是unicode编码的汉字'
我是unicode编码的汉字

前面我们提到,在这种情况下,使用utf8编码来支持中文是最好的,因此我们在写一个python源码文件时,最好的办法是保存成一个utf8无BOM编码文件,这样的文件你使用notepad++这样的高级文本编辑器软件就可以保存(软件自己百度,免费下载)。

当python解释器读取这样的源码时,为了让它按照utf8读取,通常我们会在整个文件的前两行加上这两行代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释。

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

同时,在源码中,用到中文输出的地方,中文字符串要转变成unicode字符串:

#!usr/bin/env python
# -*- coding: utf-8 -*-
print u'雪山凌狐教程欢迎你!'

这样就能保证正常显示汉字了。

 

 

当你使用raw_input时,由于本命令的参数不支持直接传入unicode,需要一个文本字符串传入,因此如果你直接这样写:

#!usr/bin/env python
# -*- coding: utf-8 -*-


word = raw_input(u'请输入一个单词好吗:')
print word

python就会报错,因此需要将字符串编码成gbk格式即可让我们看到正常的汉字:

#!usr/bin/env python
# -*- coding: utf-8 -*-


word = raw_input(u'请输入一个单词好吗:'.encode('gbk'))
print word

当你需要大量使用这样的转换的时候,你可以设置默认编码格式:

#!usr/bin/env python
# -*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('gbk')

word = raw_input(u'请输入一个单词好吗:')
print word

也许是Python的bug在import sys后必须再一次reload(sys),下面去设置默认字符编码的语句才能生效。

如果是要将中文写到某些文件里面,比如写入数据库里面,那么一般会写成utf8编码,这种情况下,上面的那几行设置默认编码的代码要改成:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

 

相信在本节课的学习之后,大家对于在python中显示中文汉字以及输出中文汉字有了一个大致的了解,祝大家编码顺利!

感谢大家的收看,我们下期再见!

avatar

发表评论

您必须才能发表评论!