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

Posted

技术标签:

【中文标题】使用控制台让 python 在 Windows XP 上以 UTF8 打印【英文标题】:Getting python to print in UTF8 on Windows XP with the console 【发布时间】:2011-10-24 06:33:21 【问题描述】:

我想在 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? 我刚刚更新了我的答案 - 这是在 Python 3.3 中添加的。 另见:***.com/a/30505612/788700 【参考方案1】:

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

【讨论】:

【参考方案2】:

当我在 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 支持列为一项新功能。

【讨论】:

不,当chcp 65001 也处于活动状态时,Python 3.2 对我来说崩溃了。该特定问题已被关闭为无效,未修复。 @Mark Tolonen,感谢您的更新。显然我的阅读理解能力需要提高。【参考方案3】:

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

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

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

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

这对我有用。

【讨论】:

【参考方案4】:

在你的胜利中设置这个:

set PYTHONIOENCODING=utf-8

【讨论】:

以上是关于使用控制台让 python 在 Windows XP 上以 UTF8 打印的主要内容,如果未能解决你的问题,请参考以下文章

Python基础系列讲解-自动控制windows桌面

Python基础系列讲解-自动控制windows桌面

Python3.x 配置原生虚拟环境

如何让 Python (2.7.x) 程序输出类似 nethack 的 ASCII 图形?

python matplotlib怎么让x轴只显示固定个数的标签

如何在 Windows 中同时安装 Python 2.x 和 Python 3.x