在Windows XP的控制台中让Python以UTF8输出

12 投票
4 回答
6974 浏览
提问于 2025-04-16 23:18

我想在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 个回答

1

在你的Windows系统中设置这个:

set PYTHONIOENCODING=utf-8
4

当我在 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 的支持作为一个新功能。

8

我想在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。

撰写回答