【发布时间】: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