在Windows XP的控制台中让Python以UTF8输出
我想在Windows XP上设置我的控制台,让它支持UTF8编码,并且希望Python能够识别并使用这个编码。
到目前为止,我的尝试是:
C:\Documents and Settings\Philippe>C:\Python25\python.exe
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'é'
é
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> quit()
所以,默认情况下,我的编码是cp437,Python对此能够正确识别。
C:\Documents and Settings\Philippe>chcp 65001
Active code page: 65001
C:\Documents and Settings\Philippe>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp65001'
>>> print u'é'
C:\Documents and Settings\Philippe>
但是,现在看起来在使用UTF8打印的时候,Python会崩溃……
4 个回答
在你的Windows系统中设置这个:
set PYTHONIOENCODING=utf-8
当我在 Python 2.7 上尝试同样的操作时,遇到了在 import sys
时的错误:
LookupError: unknown encoding: cp65001
这让我觉得 Python 不知道怎么处理 Windows 特有的 UTF-8 编码方式,而 2.5 版本对此的处理也不太好。
显然,这个问题被调查过,但在 Python 3.2 中并没有得到解决:http://bugs.python.org/issue6058
更新:在 Python 3.3 的新特性 中,提到了对 cp65001
的支持作为一个新功能。
我想在Windows XP的控制台上配置支持UTF8。
我觉得这可能不太行。
65001这个代码页有很多问题;一些标准输入输出的调用会出错,导致很多工具无法正常工作。虽然你可以手动注册cp65001作为编码:
def cp65001(name):
if name.lower()=='cp65001':
return codecs.lookup('utf-8')
codecs.register(cp65001)
这样你就可以使用print u'some unicode string'
来打印内容,但这并不允许你在这个Unicode字符串中写入非ASCII字符。你会遇到同样奇怪的错误(比如IOError 0等),就像你直接尝试将非ASCII的UTF-8序列作为字节字符串写入时那样。
不幸的是,UTF-8在Windows下的支持并不好。NT的Unicode模型是在UTF-8出现之前制定的,因此你在需要一致的Unicode时,通常得使用每个字符占用两个字节的编码(比如UTF-16,最初是UCS-2)。使用字节字符串的方式,比如很多用C的stdio
写的可移植应用和语言(例如Python),并不符合这个模型。
而且,把Python改成使用Windows的Unicode控制台调用(比如WriteConsoleW),而不是可移植的C标准输入输出方式,会和一些命令行技巧(比如管道和重定向到文件)不太兼容。(更别提你还得把默认的终端字体换成TTF字体,才能看到结果……)
总的来说,如果你需要一个支持UTF-8的命令行来运行基于标准输入输出的应用,可能更好的是使用一些专门支持UTF-8的替代工具,比如Cygwin,或者Python的IDLE和pywin32的PythonWin。