Python教程1-3:中文输出的问题

在尝试前面示例的过程中,我想一定也会有小伙伴尝试用print来输出我们熟悉的中文字符吗?但很不幸的是,通常是失败了。比如,你输入的是print("你好,世界!"),然后运行后并没有如预期地输出“你好,世界!”的文字,而是一段出错信息。

  File "D:\Dev\python27\1-3printFormat.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file D:\Dev\python27\1-3printFormat.py on line 1, 
but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
[Finished in 1.2s with exit code 1]

这是因为,在默认情况下,Python只支持ASCII编码的字符,这个字符集只包含了英文字母、数字以及特殊控制符等,合计127。当我们在其中输入中文字符的时候,Python就读不懂了,这就好像你跟一个没学过中文的外国人讲普通话,当然就不理解了。

其实这是在字符显示上的一个历史遗留问题了,早期的计算机系统资源紧缺,所以在字符这类编码上能省则省,对于英语而言,ASCII通常也就够用了。

但是不同国家的计算机系统怎么办呢?这里面处理方式就不一样了,Windows默认采用的就是针对各种国家发行不同字符集版本,比如中国大陆采用的是GB2312、GBK,用它来显示简体中文的字符。在台湾省则采用Big5,显示的是繁体中文。但是这样有一个缺点,不同字符集的软件与文档在交流的时候就会出现各种问题,比如一个Big5字符集的软件在GB2312的Windows中,相关字符就无法显示了。

上面这种方式虽然解决了东亚字符等信息在计算机中的存储与显示,但也给不同系统间的数据交换带来了很大的问题。所以后来就出现了统一字符编码的方案,目前应用最广的就是UTF-8。简单地说,UTF-8字符集足够的大,除了英文字符与控制指示,它还有足够的编码空间来存储简体中文、繁体中文、日语、韩语等的字符,这下问题似乎就简单了,只要大家都使用UTF-8那就不存在字符间的显示错乱问题了。顺便说一下,我们所熟知的Android、iOS等手机操作系统,以及Mac、Linux等桌面操作系统,采用的编码就是UTF-8。

然而,作为世界上使用率最广的操作系统,Windows默认采用的依然是原先的编码方案(虽然它在系统中也集成了UTF-8字符读写的功能),所以这也就造成了很多时候文件交流上的不便。比如,你在Windows上用记事本程序创建的一个文本文件,复制到Mac中用TextEdit打开的时候,却可能是乱码。

如果你没有接触过除Windows之外的系统,那么我可以举一个更常见的例子。比如下图是一个用UTF-8编码的网页,在正常情况下,即以UTF-8编码打开的时候,显示的效果是这样的。

Python教程1-3:中文输出的问题_第1张图片
UTF-8编码

然而,当我们转而用GB18030编码方案来打开的时候,你就会发现,世道变了,字符乱了。

Python教程1-3:中文输出的问题_第2张图片
GB18030编码

如果你要体验一下,可以随便打开一个网页,然后在浏览器的编码切换菜单中更换一种编码方案来浏览。不同的浏览器更改编码方案的操作不一,以QQ浏览器为例,可以右键单击,选择”编码”。


Python教程1-3:中文输出的问题_第3张图片
更换编码方案

我知道,你可能又有问题了,那既然网页是UTF-8编码,而Windows默认的不是UTF-8,那为什么我们的浏览器默认情况下就可以正常选择UTF-8来显示输出呢?这是因为,在编写网页的HTML文件头部,通常会有一个类似于的声明,这个标签的意思是告诉浏览器,当前文档是一个HTML文档,采用的字符集是UTF-8。

作了这么多的铺垫,差不多是可以介绍如何解决这个问题了。方法非常的简单,我们也只需要像HTML文件一样,在文件的头部声明一下这个文档采用UTF-8编码(当然你要选择别的编码也行)就可以了。Python中声明的格式如下:

# coding: UTF-8

此外,你也可以用coding = 编码方案的方式来表示。更加规范的表示方式是# -*- coding: -*-,这样在辩识度上更好,但从效果上是一样的。

现在问题就解决了,我们在包含了中文信息的文件头部增加上面的声明信息,保存了就可以正常运行了。

Python教程1-3:中文输出的问题_第4张图片
中文字符的输出

顺便说一下,你设置了UTF-8格式的编码方案后,也需要同时将此文档另存为UTF-8格式。在Sublime Text中,默认就已经是UTF-8了,但在其它的编辑器里,你需要在选项或者保存对话框中选择一下。以“记事本”为例,可以在保存对话框的编码中选择“UTF-8”。

Python教程1-3:中文输出的问题_第5张图片
另存为UTF-8(记事本)

建议阅读:https://www.python.org/dev/peps/pep-0263/#defining-the-encoding

我有意申请与微博的联合认证作者,条件之一是写作的文章需要有2000个喜欢,所以你点个赞再走吧,也欢迎你订阅本人编辑的专题

你可能感兴趣的:(Python教程1-3:中文输出的问题)