Windows 控制台编码

Windows console encoding

Windows 上的默认控制台编码是什么?似乎有时它是由 chcp 命令给出的 ANSI 编码(默认为西欧 CP-1252), sometimes it is the OEM encoding (CP-850)。

注。 – 在这些示例中,我在 Windows 10.

上使用了 Powershell 5.1 和 CPython 2.7.14

首先,对于所有 non-ASCII 个字符,这里重要的是您的控制台编码和 Windows 语言环境设置,您使用的是 字节字符串 Python 只是打印出它接收到的字节。在将这些字节传递给 Python 之前,控制台会将您的键盘输入编码为特定的字节或字节序列。对于 Python,这只是不透明的数据(0-255 范围内的数字),并且 print 将这些数据传回控制台的方式与 Python 接收它们的方式相同。

在 Powershell 中,通过 command-line 开关发送到 Python 的字节使用什么编码不是由 chcp 代码页决定的,而是由 语言决定的对于您的控制面板中的 non-Unicode 程序 设置(搜索 Region,然后找到 Administrative 选项卡)。 此设置é 编码为 0xE9,然后将其作为 command-line 参数传递给 Python。有a large number of Windows codepages that use 0xE9 for é (but there is no such thing as an ANSI encoding).

同样适用于环境变量。 Python指编码Windows在这里用作MBCS codec; you can decode command-line parameters or environment variables to Unicode using the 'mbcs' codec, which uses the MultiByteToWideChar() and WideCharToMultiByte()WindowsAPI函数,带有CP_ACP标志。

当使用交互式提示时,Python 将传递由 Powershell 控制台语言环境代码页编码的字节,设置为 chcp。对于您来说,这是代码页 850,当您键入 é 时,会收到一个十六进制值为 0x82 的字节。因为 print 将相同的 0x82 字节发送回同一控制台,控制台随后将 0x82 转换回屏幕上的 é 字符。

只有当您使用 Unicode 文本(使用像 u'é' 这样的 unicode 字符串文字)时,Python 才会对数据进行任何解码和编码。 print 写入 sys.stdout,它被配置为将 Unicode 数据编码为当前语言环境(或 PYTHONIOENCODING,如果已设置),因此 print u'é' 会将 Unicode 对象写入 sys.stdout,然后使用配置的编解码器将该对象编码为字节,然后将这些字节写入控制台。

要从 u'é' 源代码文本(本身是一个字节序列)生成 unicode 对象,Python 必须解码给定的源代码。对于 -c 命令行,在 中传递的字节。在交互式控制台中,使用语言环境。所以在交互式会话中 python -c "print u'é'"print u'é' 将导致不同的输出。

需要注意的是Python3全程使用Unicode字符串,command-line参数和环境变量用Windows[=64=加载到Python ] APIs 以 UTF-16 格式访问数据,然后呈现为 ​​Unicode 字符串对象。您仍然可以访问字节字符串形式的控制台数据和文件系统信息,但是从 Python 3.6 开始,accessing the filesystem and stdin/stdout/stderr streams as binary uses UTF-8 encoded data(再次使用 'wide' APIs)。