12

我在 Windows 8 的 CMD 上,我已将代码页设置为 65001 ( chcp 65001)。我正在使用 Python 2.7.2 (ActivePython 2.7.2.5) 并将PYTHONSTARTUP环境变量设置为“bootstrap.py”。

引导程序.py:

import codecs
codecs.register(
    lambda name: name == 'cp65001' and codecs.lookup('UTF-8') or None
)

这让我可以打印 ASCII:

>>> print 'hello'
hello
>>> print u'hello'
hello

但是当我尝试使用非 ASCII 字符打印 Unicode 字符串时遇到的错误对我来说毫无意义。在这里,我尝试打印一些包含北欧符号的字符串(为了便于阅读,我在打印之间添加了额外的换行符):

>>> print u'æøå'
��øåTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory

>>> print u'åndalsnes'
��ndalsnes

>>> print u'åndalsnesæ'
��ndalsnesæTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

>>> print u'Øst'
��st

>>> print u'uØst'
uØstTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

>>> print u'ØstÆØÅæøå'
��stÆØÅæøåTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

>>> print u'_ØstÆØÅæøå'
_ØstÆØÅæøåTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

如您所见,它并不总是引发错误(甚至不会每次都引发相同的错误),并且北欧符号只是偶尔正确显示。

有人可以解释这种行为,或者至少帮我弄清楚如何正确地将 Unicode 打印到 CMD 吗?

4

1 回答 1

1

尝试这个 :

# -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    print u'æøå'

在交互式 python 会话中使用 from __future__ import unicode_literals会很有用。

当然可以使用WriteConsoleW成功地将 Unicode 写入控制台。无论控制台代码页如何,包括 65001,这都有效。这里的代码是这样做的(它适用于 Python 2.x,但无论如何您都会从 C 调用 WriteConsoleW)。

WriteConsoleW 有一个我知道的错误,即一次写入超过 26608 个字符时失败。通过限制在单个调用中传递的数据量很容易解决这个问题。

字体不是 Python 的问题,但编码才是。仅仅因为某些用户可能没有选择可以显示这些字符的字体而无法输出正确的字符是没有意义的。这个错误应该重新打开。

(为了完整起见,可以使用 Lucida Console 和 Consolas 以外的字体在控制台上显示 Unicode,但它需要注册表破解。)我希望它有所帮助。

于 2014-07-09T07:59:12.447 回答