这里上传一份目前的最新版本(10.0.14393.33),与Python解压到相同目录即可使用。
一、控制台(PEP 528)
Python 2.x/3.x在Windows平台,长期以来对于控制台输入输出的做法,都是转换为OEM编码按字节输入输出。但是事实上OEM编码已经过时,在输出某些文本的时候,经常会出现一些OEM编码不支持的字符,导致print直接崩溃,让人感到非常棘手。
Python迟迟未改变可能是因为:长期以来(直到Windows 8.1)Windows控制台都在使用OEM点阵字体,根本无法显示Unicode字符,所以大多数情况下是不可能发现控制台居然还能显示Unicode字符的。直到Windows 10,控制台才开始使用可以显示Unicode字符的TrueType字体。
根据最新的Python 3.6.0发行说明(XXXXXXXXXXXXXXXXXXXXXX/downloads/release/python-360/),Python 3.6加入了以下特性:
在交互模式下,XXXXXXdin/stdout/stderr将使用UTF-8编码,.encoding返回'utf-8',而在重定向模式下,将继续使用以前默认的ANSI编码,.encoding返回'cpXXX'。(顺便说一下,重定向模式下Python 2.7这里居然返回空白,需要XXXXXXXXXtpreferredencoding()。。。)
可使用%PYTHONLEGACYWINDOWSSTDIO%环境变量以阻止交互模式下使用UTF-8,改为使用以前的OEM编码,.encoding将返回'cpXXX',代码页可能和ANSI编码不同。
虽然重定向模式下使用的仍然是ANSI编码,但是可以设置环境变量%PYTHONIOENCODING%为utf-8强制输出为UTF-8,实际上也不是问题,只是为兼容性做的让步而已。
也就是说,现在已经不用担心Python 3在print的时候会莫名其妙崩溃了。
二、文件名(PEP 529)
除了控制台以外,对于以字节字符串表示的文件名,也将以UTF-8处理,XXXXXXtfilesystemencoding()将返回'utf-8'。
可以使用%PYTHONLEGACYWINDOWSFSENCODING%环境变量和sys._enablelegacywindowsfsencoding()改回原来的MBCS方式,XXXXXXtfilesystemencoding()将返回原来的'mbcs'。
不过其实这个改变影响并不大,Python早就可以在Windows下使用Unicode文件名了。
[修改于 7年11个月前 - 2017/01/20 01:05:59]
如果必须用老版本的话,有一个解决方法,在IDLE中运行脚本就可以避免出现print崩溃。原因是IDLE是支持Unicode的。
Python 2.7使用from __future__ import division,absolute_import,print_function,unicode_literals,可以在语法层面开启Python 3模式。
Python 2/3在细节上的区别更多,比如模块、类、函数名称,基类object之类的,真正移植起来要处理的东西很多,远不止四个import这么简单,但是以后想要移植到或者兼容Python 3.x就会方便很多,因为这四个功能是Python 2和Python 3移植困难的最主要原因。
如果要加中文的话,还要加上# -*- encoding: utf-8 -*-,因为Python 2.7默认认为脚本是ISO-8859-1。
<code class="language-py">#!/usr/bin/env python # -*- encoding: utf-8 -*- from __future__ import division,absolute_import,print_function,unicode_literals import sys; import os; print("Python版本:" + str(sys.version_info.major)); </code>
特别是如果需要跨平台的话,即使是想要继续使用Python 2,也建议加上encoding声明和unicode_literals,不然就只能用英文了。
<code class="language-py">#!/usr/bin/env python # -*- encoding: utf-8 -*- from __future__ import unicode_literals </code>
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。