Windows 控制台编码
Windows console encoding
Windows 上的默认控制台编码是什么?似乎有时它是由 chcp
命令给出的 ANSI 编码(默认为西欧 CP-1252), sometimes it is the OEM encoding (CP-850)。
命令行参数和环境变量触发ANSI编码(é
= 0xe9) :
> chcp 850
Active code page: 850
> python -c "print 'é'"
Ú
> python -c "print '\x82'"
é
> python -c "print '\xe9'"
Ú
> $env:foobar="é"; python -c "import os; print os.getenv('foobar')"
Ú
> chcp 1252
Active code page: 1252
> python -c "print 'é'"
é
> python -c "print '\x82'"
,
> python -c "print '\xe9'"
é
> $env:foobar="é"; python -c "import os; print os.getenv('foobar')"
é
Python控制台和标准输入触发OEM编码(é
= 0x82 如果 OEM 编码是 CP-850,é
= 0xe9 如果 OEM 编码是 CP-1252):
> chcp 850
Active code page: 850
> python
>>> print 'é'
é
>>> print '\x82'
é
>>> print '\xe9'
Ú
> python -c "print raw_input()"
é
é
> chcp 1252
Active code page: 1252
> python
>>> print 'é'
é
>>> print '\x82'
,
>>> print '\xe9'
é
> python -c "print raw_input()"
é
é
注。 – 在这些示例中,我在 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)。
Windows 上的默认控制台编码是什么?似乎有时它是由 chcp
命令给出的 ANSI 编码(默认为西欧 CP-1252), sometimes it is the OEM encoding (CP-850)。
命令行参数和环境变量触发ANSI编码(
é
= 0xe9) :> chcp 850 Active code page: 850 > python -c "print 'é'" Ú > python -c "print '\x82'" é > python -c "print '\xe9'" Ú > $env:foobar="é"; python -c "import os; print os.getenv('foobar')" Ú > chcp 1252 Active code page: 1252 > python -c "print 'é'" é > python -c "print '\x82'" , > python -c "print '\xe9'" é > $env:foobar="é"; python -c "import os; print os.getenv('foobar')" é
Python控制台和标准输入触发OEM编码(
é
= 0x82 如果 OEM 编码是 CP-850,é
= 0xe9 如果 OEM 编码是 CP-1252):> chcp 850 Active code page: 850 > python >>> print 'é' é >>> print '\x82' é >>> print '\xe9' Ú > python -c "print raw_input()" é é > chcp 1252 Active code page: 1252 > python >>> print 'é' é >>> print '\x82' , >>> print '\xe9' é > python -c "print raw_input()" é é
注。 – 在这些示例中,我在 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)。