Windows上的默认控制台编码是什么?它似乎有时是ANSI编码(CP-1252),有时是由chcp命令提供的OEM编码(默认情况下是西欧的CP-850)。
é = 0xe9):chcp 850活动代码页: 850 > python -c "print‘é’é“> python -c "print‘x82’”é> python -c "print‘\xe9 9’“$env:foobar="é";python -c "import os;print os.getenv('foobar')”> chcp 1252活动代码页: 1252 > python -c "print‘x 82’“,code > python -c "print‘xe9 9’‘”$env:foobar="é";python -c "import“;打印os.getenv('foobar')“éé= 0x82;如果OEM编码为CP-1252,则é = 0xe9 ):。chcp 850活动代码页: 850 > python >>>‘éé>>> print’\x82é>>> print‘\xe9 9’> python -c "print raw_input()“éé> chcp 1252活动代码页: 1252 > python >>> print‘ééé>>> print '\x82’>>>> print‘xe9 9’> python -c "print raw_input()”ééé请注意。-在这些示例中,我在Windows10上使用了Powershell 5.1和CPython 2.7.14。
发布于 2018-03-06 08:39:56
首先,对于所有非ASCII字符,这里重要的是控制台编码和Windows语言环境设置,您使用字节字符串,Python只输出它接收到的字节。在将这些字节传递给Python之前,控制台会将键盘输入编码成特定的字节或字节序列。对于Python来说,这都是不透明的数据(数字在0-255范围内),而print将这些数据以Python接收的方式传递回控制台。
在Powershell中,通过命令行开关发送到Python的字节的编码方式不是由chcp代码页决定,而是由控制面板中的非Unicode程序语言设置来决定(搜索区域,然后找到管理选项卡)。正是这个设置将é编码为0xE9,然后将其作为命令行参数传递给Python。有一些大量Windows代码页将0xE9用于é (但有没有ANSI编码这样的东西)。
环境变量也是如此。Python指的是Windows在这里使用的编码作为MBCS编解码;您可以使用'mbcs'编解码器将命令行参数或环境变量解码为Unicode,后者使用带有CP_ACP标志的MultiByteToWideChar()和WideCharToMultiByte() Windows函数。
当使用交互式提示符时,Python会以Powershell控制台代码页编码的方式传递字节,使用chcp设置。对于您来说,这是代码页850,输入é时会收到一个十六进制值0x82的字节。因为print将相同的0x82字节发送回同一个控制台,所以控制台将0x82转换回屏幕上的é字符。
只有当您使用Unicode文本(使用像u'é'这样的unicode字符串)时,Python才会对数据进行任何解码和编码。print写入到sys.stdout,后者配置为将Unicode数据编码到当前区域设置(如果设置为PYTHONIOENCODING ),因此print u'é'将该Unicode对象写入sys.stdout,然后sys.stdout使用配置的编解码器将该对象编码为字节,然后将这些字节写入控制台。
要从unicode源代码文本(本身是一个字节序列)生成u'é'对象,Python必须对给定的源代码进行解码。对于-c命令行,在被解码为拉丁文-1中传递的字节。在交互控制台中,使用区域设置。因此,交互会话中的python -c "print u'é'"和print u'é'将产生不同的输出。
应该注意的是,Python 3自始至终都使用Unicode字符串,命令行参数和环境变量通过Windows 'wide‘API加载到Python中,以UTF-16的形式访问数据,然后以Unicode字符串对象的形式表示。您仍然可以以字节字符串的形式访问控制台数据和文件系统信息,但从Python3.6,以二进制方式访问文件系统和stdin/stdout/stderr流使用UTF-8编码的数据。 (再次使用“wide”API)开始。
https://stackoverflow.com/questions/49121900
复制相似问题