问题
当我想在Python解释器中输入Unicode字符时(为了简单起见,我在示例中使用了a-umlaut,但我最初遇到的是波斯语字符),问题就出现了。每当我使用CHCP 65001
代码页运行Python,然后尝试输入一个Unicode字符时,Python就会退出而没有任何错误。
我花了几天时间试图解决这个问题,但都没有成功。但今天,我在Python网站上找到了一个帖子,另一个在MySQL上,还有一个在Lua-users上,其中提出了关于这种突然退出的问题,尽管没有任何解决方案,一些人说chcp 65001
本质上是有问题的。
彻底弄清楚这个问题是与chcp设计相关还是存在可能的解决方法将是很好的。
重现错误
chcp 65001
Python 3.X:
Python shell
print('ä')
结果:它只是退出了shell
然而,这个可以工作:python.exe -c "print('ä')"
还有这个:print('\u00e4')
结果:ä
在Luajit2.0.4中
print('ä')
结果:它只是退出了shell
然而这个可以工作:print('\xc3\xa4')
到目前为止,我得出了以下观察结果:
- 使用命令提示符直接输出可以工作。
- 基于Unicode、基于十六进制的字符等价物可以工作。
所以
这不是Python的错误,我们不能直接在Windows命令提示符或其任何包装器(如ConEmu、Cmder)中使用Unicode字符。我正在使用Cmder来在Windows shell中查看和使用Unicode字符,并且没有遇到任何问题。这样正确吗?
input
将其处理为EOF。问题在于conhost.exe假定它正在将其UTF-16输入缓冲区编码为具有每个字符1个字节的ANSI代码页,因此对于非ASCII UTF-8,其WideCharToMultiByte
编码缓冲区太小。读取失败,但它被返回给客户端作为0字节的“成功”读取,即文件结束。 - Eryk Sunprint('ä')
并且它可以正确地打印出来。因此,“在所有Windows版本中都能重现”这个说法是不准确的,至少对于这个特定的例子而言。 - Mark Tolonen