为什么Windows上的python 2.7在打印时需要一个空格才能打开unicode字符?

时间:2015-06-18 19:11:55

标签: python python-2.7 unicode

我使用cmd Windows,chcp 65001,这是我的代码:

print u'\u0110 \u0110' + '\n'

结果:

 (a character cmd can't display) (character what i want)
 Traceback (most recent call last):
      File "b.py", line 26, in <module>
        print u'\u0110 \u0110'
    IOError: [Errno 2] No such file or directory

但是,当我使用这段代码时:

print u' \u0110 \u0110' + '\n'

结果:

(a space)(charecter what i want) (character what i want)
Traceback (most recent call last):
  File "b.py", line 26, in <module>
    print u' \u0110 \u0110' + '\n'
IOError: [Errno 2] No such file or directory

我的屏幕: enter image description here

我的问题是:

  • 为什么python 2.7在打印unicode字符时需要空格?

  • 如何修复IOError:[Errno 2]

2 个答案:

答案 0 :(得分:5)

在Windows上,您可以使用print打印任意字符串(只要字体可以显示字符)。只需print Unicode并配置您的环境。

例如,print_unicode.py

#!/usr/bin/env python
print(u'\u0110\u0110')

要打印到Windows控制台,您可以使用win-unicode-console package

T:\> py -mpip install win-unicode-console
T:\> py -mrun print_unicode.py

不要忘记配置适当的控制台字体。在这种情况下,chcp返回值无关紧要。

您可以call WriteConsoleW() function (Unicode API) manually将任意文本打印到Windows控制台。

您不需要第三方模块,将输出重定向到文件:

T:\> set PYTHONIOENCODING=utf-8
T:\> py print_unicode.py >output-utf-8.txt

注意:未使用run模块。它适用于Python 2和3。

如果您不需要打印非BMP Unicode字符,那么您可以使用stdlib中的Python IDLE,例如,在Python 3中:

T:\> py -3 -midlelib -r print_unicode.py

IDLE也可以在Python 2上使用,但调用是不同的。

答案 1 :(得分:4)

简短回答

在Windows上,您无法使用print打印任意字符串。

有一些解决方法,如下所示:How to make python 3 print() utf8。但是,尽管有这个问题的标题,你不能使用它来实际使用代码页65001打印UTF-8,它将在完成后重复最后几个字节(正如我进一步描述的那样)

示例:

#! python2
import sys

enc = sys.stdout.encoding

def outputUnicode(t):
    bytes = t.encode(enc, 'replace')
    sys.stdout.write(bytes)

outputUnicode(u'The letter \u0110\n')

答案很长

您可以使用chcp将控制台的代码页更改为包含要打印字符的代码页。例如,运行chcp 852

如果我打印以下字符串,这些是我的框中的结果。我正在使用代码页850,这是英语系统的默认设置:

u"\u00abHello\u00bb"  # "«Hello»" 
u"\u0110"  # "Đ"
u"\u4f60\u597d"  # "你好"
u"a\u2192b\u2192c"  # "a→b→c"

第一个命令将起作用,因为所有字符都在代码页850中。接下来的3个将失败。

UnicodeEncodeError: 'charmap' codec can't encode character u'\u0110' in position 0: character maps to <undefined>

将代码页更改为852,第二个命令将起作用。

有一个UTF-8代码页(65001)但它不适用于python 2.7。

在python 3.4中,结果是一样的。如果您将代码页更改为65001,您将获得稍微减少的破坏行为。

\Python34\python.exe -c "print(u'a\u2192b\u2192c')" a→b→c �c C:\>

两个额外字符( c)是Windows上C标准库中非标准行为的结果。它们是字符串的UTF-8编码中最后2个字节的重复。