让python在Windows XP上使用控制台以UTF8进行打印

时间:2011-08-10 16:34:20

标签: python windows unicode utf-8 windows-xp

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

答案 0 :(得分:8)

  

我想在Windows XP上配置我的控制台以支持UTF8

我认为不会发生这种情况。

65001代码页是错误的;一些stdio调用行为不正确并打破了许多工具。您可以手动将cp65001注册为编码:

def cp65001(name):
    if name.lower()=='cp65001':
        return codecs.lookup('utf-8')

codecs.register(cp65001)

这允许您print u'some unicode string',它不允许您在该Unicode字符串中写入非ASCII字符。当您尝试将非ASCII UTF-8序列直接写为字节字符串时,会得到相同的奇怪错误(IOError 0等)。

不幸的是,UTF-8是Windows下的二等公民。 NT的Unicode模型是在UTF-8存在之前制定的,因此你需要在任何你想要一致的Unicode的地方使用每个代码单元编码两个字节(UTF-16,最初是UCS-2)。使用字节字符串,就像用C stdio编写的许多可移植应用程序和语言(如Python)一样,不适合该模型。

重写Python以使用Windows Unicode控制台调用(如WriteConsoleW)而不是便携式C stdio调用不适合使用像管道和重定向到文件的shell技巧。 (更不用说你仍然需要从默认终端字体更改为TTF,然后才能看到结果正常工作......)

最终,如果您需要一个支持基于stdio的应用程序的UTF-8支持的命令行,那么您可能最好使用故意支持它的Windows控制台的替代方案,例如Cygwin,或Python的IDLE或pywin32的PythonWin的。

答案 1 :(得分:4)

当我在Python 2.7上尝试相同的操作时,我在import sys上收到错误:

  

LookupError:未知编码:cp65001

这对我来说意味着Python不知道如何使用特殊的Windows UTF-8代码页,并且2.5处理不当的情况。

显然在Python 3.2中对此进行了调查并且http://bugs.python.org/issue6058

更新:在What's New In Python 3.3中,它将cp65001支持列为新功能。

答案 2 :(得分:0)

我在使用Windows Vista的Python脚本中在cmd控制台中显示欧元符号时遇到问题。这对我有用:

拳头,我需要确保字体设置为Lucinda Console而不是光栅字体不起作用。这可以通过在控制台窗口的下拉菜单中设置控制台的默认属性并使用cmd.exe重新启动控制台窗口来完成。

其次,当我运行cmd时,我将代码页设置为chcp 1252

第三,我确保我的编辑器(Notepad ++)具有正确的编码设置。在Notepad ++的Encoding下拉菜单中选择Encode in UTF-8

这对我有用。

答案 3 :(得分:0)

在胜利中设置此项:

set PYTHONIOENCODING=utf-8