1

我正在运行 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'

该怎么办?

4

1 回答 1

4

实际上,Python 和 Windows 控制台之间的交互存在一个错误(参见http://bugs.python.org/issue1602)。可以使用 C 函数 ReadConsoleW、WriteConsoleW 代替 ReadConsole 和 WriteConsole 在 Windows 控制台中读取和写入 Unicode。因此,一个似乎可行的解决方案是编写自己的 stdout 和 stdin 对象,通过 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。

于 2013-07-27T18:43:46.780 回答