Loading... <div class="tip share">请注意,本文编写于 2294 天前,最后修改于 1197 天前,其中某些信息可能已经过时。</div> 相信学习 python 的同学或多或少都经历过中文乱码的窘境,最近我在弄一些 python 的脚本的时候也遇到了这样的难题。以我安装的 python 2.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 的支持。 ```bash >>> print u'我是unicode编码的汉字' 我是unicode编码的汉字 ``` 前面我们提到,在这种情况下,使用 utf8 编码来支持中文是最好的,因此我们在写一个 python 源码文件时,最好的办法是保存成一个 utf8 无 BOM 编码文件,这样的文件你使用 notepad++ 这样的高级文本编辑器软件就可以保存(软件自己百度,免费下载)。 当 python 解释器读取这样的源码时,为了让它按照 utf8 读取,通常我们会在整个文件的前两行加上这两行代码: ```python #!/usr/bin/env python # -*- coding: utf-8 -*- ``` 第一行注释是为了告诉 Linux/OS X 系统,这是一个 Python 可执行程序,Windows 系统会忽略这个注释。 第二行注释是为了告诉 Python 解释器,按照 UTF-8 编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。 同时,在源码中,用到中文输出的地方,中文字符串要转变成 unicode 字符串: ```python #!usr/bin/env python # -*- coding: utf-8 -*- print u'雪山凌狐教程欢迎你!' ``` 这样就能保证正常显示汉字了。 当你使用 `raw_input` 时,由于本命令的参数不支持直接传入 unicode,需要一个文本字符串传入,因此如果你直接这样写: ```python #!usr/bin/env python # -*- coding: utf-8 -*- word = raw_input(u'请输入一个单词好吗:') print word ``` python 就会报错,因此需要将字符串编码成 gbk 格式即可让我们看到正常的汉字: ```python #!usr/bin/env python # -*- coding: utf-8 -*- word = raw_input(u'请输入一个单词好吗:'.encode('gbk')) print word ``` 当你需要大量使用这样的转换的时候,你可以设置默认编码格式: ````python #!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 编码,这种情况下,上面的那几行设置默认编码的代码要改成: ```python import sys reload(sys) sys.setdefaultencoding('utf-8') ``` 相信在本节课的学习之后,大家对于在 python 中显示中文汉字以及输出中文汉字有了一个大致的了解,祝大家编码顺利! 感谢大家的收看,我们下期再见! 最后修改:2021 年 08 月 15 日 © 允许规范转载 赞 赠人玫瑰,手留余香