【发布时间】:2017-02-05 19:23:23
【问题描述】:
问题
当我想在 Python 解释器中 input Unicode 字符时出现问题(为简单起见,我在示例中使用了变音符号,但我首先遇到了波斯语字符)。每当我将 python 与 chcp 65001 代码页一起使用,然后尝试输入一个 Unicode 字符时,Python 都会退出而不会出现任何错误。
我花了几天时间试图解决这个问题,但无济于事。但是今天,我在python website、MySQL 和 Lua-users 上发现了一个帖子,虽然没有任何解决方案,但有人说chcp 65001 天生就坏了。
最好一劳永逸地知道这个问题是与 chcp-design 相关还是有可能的解决方法。
重现错误
chcp 65001
Python 3.X:
Python 外壳
print('ä')
结果:它只是退出了外壳
然而,这行得通python.exe -c "print('ä')"
还有这个:print('\u00e4')
结果:ä
在Luajit2.0.4
print('ä')
结果:它只是退出了外壳
但是这可行:print('\xc3\xa4')
到目前为止,我已经提出了这个观察结果:
- 使用命令提示符直接输出有效。
- 基于 Unicode 的、基于十六进制的等效字符作品。
所以 这不是 Python 错误和,我们不能直接在 Windows 命令提示符的 CLI 程序中使用 Unicode 字符或其任何包装器,如 Conemu、Cmder(我使用 Cmder 能够看到并在 Windows shell 中使用 Unicode 字符,我这样做没有任何问题)。这是正确的吗?
【问题讨论】:
-
我安装了多个 Python 版本。我无法在 Windows 10 64 位、Python 3.3.5 64 位或 Python 3.5.2 64 位上重现,但可以在 Python 2.7.12 32 位上重现。它按描述退出,但您说您使用的是 Python 3。也许这是 32 位与 64 位的问题?您使用的是 Windows cmd.exe 控制台还是其他?
-
@MarkTolonen,当使用不是为代码页 65001 设计的控制台(conhost;cmd 只是一个外壳)时,这在所有 Windows 版本中都可以重现。输入单个非 ASCII 字符会导致空读取,Python 的 REPL 和
input处理为 EOF。问题是 conhost.exe 假设它将其 UTF-16 输入缓冲区编码为每个字符 1 个字节的 ANSI 代码页,因此对于非 ASCII UTF-8,其WideCharToMultiByte编码缓冲区太小。读取失败,但它作为 0 字节的“成功”读取返回给客户端,即文件结尾。 -
@eryksun,是的,我知道它坏了,但是,在 64 位 Windows 10 上的 64 位 Python 上,我可以使用国际 IME 输入 cmd.exe
print('ä')和它正确打印出来。所以“在所有 Windows 中可重现”的版本是不准确的,至少对于这个特定的例子是这样。 -
@MarkTolonen,你安装了 pyreadline 吗?
-
@eryksun,是的,这也破解了
WriteFile吗?
标签: python windows unicode cmd codepages