首先,我将Windows CMD编码改为utf-8并运行Python解释器:
chcp 65001
python
然后我试着在里面打印一个unicode标记,当我这样做时,Python以一种特殊的方式崩溃(我只是在同一个窗口中得到一个cmd提示)。
>>> import sys
>>> print u'ëèæîð'.encode(sys.stdin.encoding)
有什么办法可以解释为什么会发生这种事以及如何让它起作用吗?
UPD:sys.stdin.encoding
返回'cp65001'
UPD2:我刚刚想到,这个问题可能与utf-8使用multi-byte character set这一事实有关(kcwu对此提出了很好的观点)。我试着用“windows-1250”运行整个示例,得到了“eaî?”。Windows-1250使用单个字符集,因此它适用于它理解的那些字符。但是我仍然不知道如何让utf-8在这里工作。
UPD3:哦,我发现它是一个known Python bug。我猜Python会将cmd编码复制为'cp65001到sys.stdin.encoding,并尝试将其应用于所有输入。因为它无法理解“cp65001”,所以在任何包含非ascii字符的输入上都会崩溃。
设置pythonionecoding系统变量:
example.py
的来源很简单:您想让Python编码为UTF-8吗?
Python不会将cp65001识别为UTF-8。
下面是如何在不更改
encodings\aliases.py
的情况下将cp65001
别名设为UTF-8:(嗯,不要在意
cp65001
在http://bugs.python.org/issue6058#msg97731与UTF-8不一样的愚蠢。即使微软的编解码器有一些小错误,它的目的也是一样的。)这里有一些代码(为Tahoe LAFS,Tahoe LAFS.org编写)可以使控制台输出工作,而不必考虑
chcp
代码页的,还可以读取Unicode命令行参数。这个解决方案背后的想法归功于Michael Kaplan。如果stdout或stderr被重定向,它将输出UTF-8。如果需要字节顺序标记,则需要显式地编写它。[编辑:此版本使用
WriteConsoleW
而不是MSVC运行库中的_O_U8TEXT
标志,这是错误的。WriteConsoleW
相对于MS文档来说也是错误的,但不是这样。]最后,它是有可能允许使用DejaVu s an s Mono,我同意这是一个很好的字体,作为控制台。
您可以在'Necessary criteria for fonts to be available in a command window' Microsoft KB中找到有关字体要求以及如何为windows控制台添加新字体的信息
但基本上,在Vista(可能也是Win7)上:
HKEY_LOCAL_MACHINE_SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
下,将"0"
设置为"DejaVu Sans Mono"
HKEY_CURRENT_USER\Console
下的每个子键,将"FaceName"
设置为"DejaVu Sans Mono"
。在XP上,检查线程'Changing Command Prompt fonts?' in LockerGnome forums。
相关问题 更多 >
编程相关推荐