【问题标题】:Unicode output in Python's stdout when running from cmd.exe [duplicate]从 cmd.exe 运行时 Python 标准输出中的 Unicode 输出 [重复]
【发布时间】:2013-07-27 19:39:34
【问题描述】:

我正在运行 Windows 7,它的控制台已配置为使用 Consolas 字体,这使我可以输出 Unicode。在控制台读取 Unicode 的能力,我已经为 Far Manager 等程序多次证明:西里尔字母和德语 äöü 字母都可以在同一个控制台上以相同的字符串读取,无需编码切换。

现在介绍 Python。

我非常努力,但在它的输出中看不到 Unicode。 默认情况下,print(sys.stdout.encoding) 打印 cp866,stdout 无法输出除 ASCII 和 Cyrillics 以外的任何字符。

它给了我以下结果:

print("Ля-ля äöüÄÖÜß")

UnicodeEncodeError: 'charmap' codec can't encode characters in position 6-12: character maps to <undefined>

print("Ля-ля äöüÄÖÜß".encode("utf-8"))

b'\xd0\x9b\xd1\x8f-\xd0\xbb\xd1\x8f \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x84\xc3\x96\xc3\x9c\xc3\x9f'

好的,我已经在批处理文件中设置了PYTHONIOENCODING 环境变量:

SET PYTHONIOENCODING=UTF-8

得到:

print(sys.stdout.encoding)
UTF-8

print("Ля-ля äöüÄÖÜß")
╨Ы╤П-╨╗╤П ├д├╢├╝├Д├Ц├Ь├Я

print("Ля-ля äöüÄÖÜß".encode("utf-8"))`
b'\xd0\x9b\xd1\x8f-\xd0\xbb\xd1\x8f \xc3\xa4\xc3\xb6\xc3\xbc\xc3\x84\xc3\x96\xc3\x9c\xc3\x9f'

怎么办?

【问题讨论】:

  • 众所周知,Windows 控制台很难将更高代码点的 unicode 值打印到。
  • @Martijn Pieters:我不确定您所说的“更高代码点”值是什么。我至少需要俄语和德语,Windows 控制台证明它可以做到。
  • 问题是你的控制台codepage需要切换,但是微软提供的codepage只有cp65001;他们对 UTF-8 的想法充满了错误。例如,请参阅alfps.wordpress.com/2011/11/22/…
  • 我使用了“higher-codepoint unicode values”这个术语来区分 ASCII 和 latin 1 代码点;数量惊人的人不将其视为 Unicode 或出于某种原因。

标签: python encoding unicode utf-8 stdout


【解决方案1】:

实际上,Python 和 Windows 控制台之间的交互存在某种错误(请参阅http://bugs.python.org/issue1602)。可以使用 C 函数 ReadConsoleW、WriteConsoleW 代替 ReadConsole 和 WriteConsole 在 Windows 控制台中读取和写入 Unicode。因此,一个似乎可行的解决方案是编写自己的标准输出和标准输入对象,通过 ctypes 调用 ReadConsoleW、WriteConsoleW。对于输出,这是可行的,但对于输入,Python 交互式解释器实际上不使用 sys.stdin 获取输入(但调用 input() 函数有效)存在问题 - 请参阅http://bugs.python.org/issue17620

很多人说Windows控制台有问题。但是您实际上可以毫无问题地输入 Unicode 字符(如果您有正确的键盘布局)。这些显示没有问题。您甚至可以使用一些 Unicode 参数运行名为“∫.py”的文件,它可以正确运行,并且参数在 sys.argv 字符串中等待正确。

更新:我已经构建了一个 Python 包来处理这些问题。请参阅 https://github.com/Drekin/win-unicode-consolehttps://pypi.python.org/pypi/win_unicode_console。通过pip install win_unicode_console 安装。它至少适用于 Python 3.4、Python 3.5 和 Python 2.7。

【讨论】:

  • 这个bug已经在2007-12-12提交了,还是没有解决!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多