在Windows XP上,让Python在控制台中以UTF8格式打印

12
我想在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崩溃...


你为什么认为你在这里首先打印了utf8? - Piotr Dobrogost
我刚刚更新了我的回答 - 这是在 Python 3.3 中添加的。 - Mark Ransom
参见:https://dev59.com/DnRB5IYBdhLWcg3wz6QJ#30505612 - Adobe
4个回答

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等)。
不幸的是,在Windows下UTF-8是二等公民。NT的Unicode模型在UTF-8存在之前就已经制定出来了,因此您需要使用每个代码单元两个字节的编码(UTF-16,最初是UCS-2),以便在任何需要一致的Unicode的地方使用。像很多可移植的应用程序和语言(如Python)使用C的stdio一样,使用字节字符串不符合这个模式。
将Python重写为使用Windows Unicode控制台调用(如WriteConsoleW)而不是可移植的C stdio之一,无法很好地与shell技巧(如管道和重定向到文件)配合使用。(更不用说您仍然需要将默认终端字体更改为TTF字体才能看到结果正常工作...)
最终,如果您需要带有工作UTF-8支持的stdio应用程序的命令行界面,那么您最好使用Windows Console的替代品,比如Cygwin或Python的IDLE或pywin32的PythonWin。

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的支持。

不,当chcp 65001也被激活时,Python 3.2在我这里会崩溃。那个特定的问题被标记为无效并未得到解决。 - Mark Tolonen
@Mark Tolonen,感谢您的更新。显然我的阅读理解能力需要提高。 - Mark Ransom

1
在您的 Windows 中设置此项:
set PYTHONIOENCODING=utf-8

0

我在使用Windows Vista的Python脚本在cmd控制台中显示欧元符号方面遇到了问题。以下是解决方法:

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

其次,运行cmd时使用chcp 1252设置代码页。

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

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接