chcp 65001 代码页导致程序终止且没有任何错误

2024-05-02

Problem

当我想要的时候问题就出现了inputPython 解释器中的 Unicode 字符(为简单起见,我在示例中使用了变音符号,但我第一次遇到波斯语字符)。每当我使用 Python 时CHCP 65001 https://ss64.com/nt/chcp.html代码页,然后尝试输入哪怕一个 Unicode 字符,Python 都会退出且不会出现任何错误。

我花了几天时间试图解决这个问题但没有成功。但今天我在网上发现了一个帖子Python网站 https://bugs.python.org/issue1602,另一个在MySQL https://bugs.mysql.com/bug.php?id=66682另一个关于 Lua 用户的问题是关于这种突然退出提出的,尽管没有任何解决方案,有些人说chcp 65001本质上是破碎的。

如果能一劳永逸地知道这个问题是否与 chcp 设计相关或者是否有可能的解决方法,那就太好了。

重现错误

chcp 65001

Python 3.X:

Python外壳

print('ä')

结果:它刚刚退出shell

However,这有效python.exe -c "print('ä')"还有这个:print('\u00e4')

结果:ä

在Luajit2.0.4中

print('ä')

结果:刚刚退出shell

然而这有效:print('\xc3\xa4')

到目前为止,我得出了这样的观察:

  1. 使用命令提示符直接输出是可行的。
  2. 基于 Unicode、基于十六进制的字符等效项。

So

这不是 Python 错误and我们不能在 Windows 命令提示符或其任何命令提示符的 CLI 程序中直接使用 Unicode 字符wrappers like ConEmu https://en.wikipedia.org/wiki/ConEmu, Cmder https://cmder.net/(我使用 Cmder 是为了能够在 Windows shell 中查看和使用 Unicode 字符,并且我这样做没有任何问题)。它是否正确?


要在 Python 2.7 和 3.x(3.6 之前)的 Windows 控制台中使用 Unicode,请安装并启用win_unicode_console https://pypi.python.org/pypi/win_unicode_console。这使用了宽字符函数ReadConsoleW https://msdn.microsoft.com/en-us/library/ms684958 and WriteConsoleW https://msdn.microsoft.com/en-us/library/ms687401,就像其他支持 Unicode 的控制台程序(例如 cmd.exe 和 powershell.exe)一样。对于 Python 3.6,一个新的io._WindowsConsoleIO添加了原始 I/O 类。它读取和写入 UTF-8 编码文本(为了与 Unix 跨平台兼容——“获取字节”——程序),但在内部它通过与 UTF-16LE 进行转码来使用宽字符 API。

您在使用非 ASCII 输入时遇到的问题在所有 Windows 版本(包括 Windows 10)的控制台中都可以重现。控制台主机进程(即 conhost.exe)不是为 UTF-8(代码页 65001)设计的,并且尚未更新以持续支持它。特别是,非 ASCII 输入会导致空读取。这反过来会导致Python的REPL退出并内置input募集EOFError.

问题是 conhost 假设单字节代码页(例如西方语言环境中的 OEM 和 ANSI 代码页(例如 437、850、1252))对其 UTF-16 输入缓冲区进行编码。 UTF-8 是一种多字节编码,其中非 ASCII 字符被编码为 2 到 4 个字节。要处理 UTF-8,需要进行多次迭代编码M / 4字符,其中 M 是 N 字节缓冲区中可用的剩余字节。相反,它假设读取 N 个字节的请求是读取 N 个字符的请求。然后,如果输入有一个或多个非 ASCII 字符,则内部WideCharToMultiByte由于缓冲区大小不足,调用失败,并且控制台返回 0 字节的“成功”读取。

如果安装了 pyreadline 模块,你可能不会在 Python 3.5 中准确地观察到这个问题。 Python 3.5 自动尝试导入readline。对于 pyreadline,输入是通过宽字符函数读取的ReadConsoleInputW https://msdn.microsoft.com/en-us/library/ms684961。这是读取控制台输入记录的低级函数。原则上它应该有效,但实际上输入print('ä')被 REPL 读取为print('')。对于非 ASCII 字符,ReadConsoleInputW返回 Alt+Numpad 的序列KEY_EVENT记录。该序列是有损 OEM 编码,除了最后一条记录(其中包含输入字符)之外,可以忽略该序列。UnicodeChar场地。显然 pyreadline 忽略了整个序列。

在 Windows 8 之前,使用代码页 65001 的输出也被破坏。它按照非 ASCII 字符的数量按比例打印一串垃圾文本。在这种情况下,问题是WriteFile and WriteConsoleA错误地返回写入屏幕缓冲区的 UTF-16 代码数,而不是 UTF-8 字节数。这会让 Python 的缓冲写入器感到困惑,导致重复写入它认为剩余的未写入字节。此问题在 Windows 8 中已修复,作为重写内部控制台 API 以使用 ConDrv 设备而不是 LPC 端口的一部分。旧版本的 Windows 可以使用 ConEmu 或 ANSICON 来解决此错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

chcp 65001 代码页导致程序终止且没有任何错误 的相关文章

随机推荐

  • 连接两个表并保存到第三个sql

    我想加入两张桌子 TableA wordA primarykey countA abc 25 abcd 29 abcde 45 TableB wordB primarykey countB ab
  • Spark 2.0:4 行。 IllegalArgumentException:界限必须为正

    我正在 Amazon EMR 5 0 上的 Spark 2 0 上尝试一个超级简单的测试程序 from pyspark sql types import Row from pyspark sql types import import py
  • XML 中的 标签导致 Android 崩溃

    我有一个带有渐变组件的图标
  • 我的负载均衡器目标组显示为“不可用” - 如何进一步调试?

    我创建了一个网络负载均衡器和一个目标组 然后我尝试为负载均衡器创建一个侦听器 但目标组在下拉菜单中显示为 不可用 我下一步可以做什么来调试这个 非常感谢您的帮助 图片 https ibin co w800 3vKxtcYYs3mg jpg
  • 在 Hadoop 中按文件中的值排序

    我有一个文件 其中每行包含一个字符串 然后是一个空格 然后是一个数字 例子 Line1 Word 2 Line2 Word1 8 Line3 Word2 1 我需要按降序对数字进行排序 然后将结果放入文件中 为数字分配排名 所以我的输出应该
  • Laravel 查询生成器 - 高级条件子句(可选参数)

    我需要带有接受可选参数的查询生成器的子句 例如 请考虑以下情况 我们有三个搜索字段 产品标题 公司名称和位置 邮政编码 城市或州 2 3 8 种可能性 该位置与 OR 连接 WHERE location postal code LIKE O
  • 如何打开 matlab p 代码文件

    有谁知道如何查看 matlab p 代码文件的代码 p 代码文件专门存在 以便您可以共享代码 以便其他人无法查看它 换句话说 您看不到 Matlab p 代码文件的代码
  • 如何在 github 中拉取请求时忽略或排除文件

    我们有 4 个分支 1 dev 2 qa 3 staging 4 master 我们要更新并添加1 dev中的CODEOWNERS文件中的一些人 2 qa到4 master的CODEOWNER文件将被保留 因为 1 dev 有 4 个审稿人
  • Cytoscape.js 强制导向布局和节点放置

    我最近发现了 Cytoscape js 并想尝试一下力导向布局 arbor 和 springy 现在 我有几个问题 是否可以通过使用其中一种布局来实现图 其中节点放置基于某种算法并且不需要节点坐标 例如 在 VivaGraphJS 中 图会
  • 什么是合约(如 C++17 的建议)?

    我读到了有关合同的内容关于 C 17 的思考 http www open std org jtc1 sc22 wg21 docs papers 2015 n4492 pdf由 B Stroustrup 撰写 并协助进行了一次小型演讲 讨论了
  • CoreData 多对多添加错误

    不确定我在这里做错了什么 School has a to many to Student and Student has its inverse 一点测试代码如下 class Student interface School NSManag
  • 具有自定义背景的 android textInputEditText 无法正常工作

    我在 textInputLayout 中使用 textInputEditText 我必须为我的 editText 设置背景才能为我的 editText 实现边框视图 但是当我在 textInputLayout 上调用 setError 时
  • 如何在 Android Studio 中为目标添加系统映像

    我有一个选项呈灰色 我必须完成该选项才能推进项目 它说 No system images installed for this target 这个答案适用于 Eclipse 但我不确定是否有 Android Studio 的等效项 无法创建
  • 在 Java 8 中,如何使用 lambda 将 Map 转换为另一个 Map

    我刚刚开始研究 Java 8 并尝试 lambda 我想我应该尝试重写我最近写的一个非常简单的东西 我需要将字符串到列的映射转换为另一个字符串到列的映射 其中新映射中的列是第一个映射中的列的防御副本 列有一个复制构造函数 到目前为止我最接近
  • 如何查明我的 Mac 上安装了哪些 Python 库?

    我刚刚开始使用 Python 发现我可以导入各种库 如何找出我的 Mac 上存在哪些可以导入的库 我如何找出它们包含哪些功能 我似乎记得使用一些网络服务器类型的东西来浏览本地帮助文件 但我可能已经想象到了 从 Python REPL 命令行
  • ProviderManifestToken 2008 或 2012

    应用程序 NET 4 5 C 使用 EF6 和数据库优先方法 支持 SQL Server 2008R2 2012 和 2014 这个问题是关于ProviderManifestToken自动生成的 edmx 文件的属性 根据使用哪个版本的数据
  • org.hibernate.AssertionFailure:例如无法执行取消删除

    当我尝试在一些删除操作后进行读取时 我收到此休眠断言错误 我找不到任何有关此 无法执行取消删除 错误的信息 除了源代码 https github com hibernate hibernate orm blob master hiberna
  • git:显示所有已修改的文件 - 已暂存和未暂存

    我需要一个命令给我所有修改过的文件 这包括暂存 即新添加的文件 和非暂存更改 在普通列表我可以在脚本中使用它 虽然这个问题可能听起来很熟悉 但我只找到接近我想要做的命令 git ls files m 列出 非分阶段 修改但忽略了上演的和新的
  • 在 Ionic/Cordova 中接收 URL

    我正在尝试设置一种从另一个应用程序接收网址的方法 就像 您在浏览器中 单击共享 然后将链接发送到另一个应用程序 我的应用程序 我发现这个科尔多瓦插件 https github com Initsogar cordova webintent
  • chcp 65001 代码页导致程序终止且没有任何错误

    Problem 当我想要的时候问题就出现了inputPython 解释器中的 Unicode 字符 为简单起见 我在示例中使用了变音符号 但我第一次遇到波斯语字符 每当我使用 Python 时CHCP 65001 https ss64 co