首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows控制台编码

Windows控制台编码
EN

Stack Overflow用户
提问于 2018-03-06 01:04:33
回答 1查看 1.7K关注 0票数 1

Windows上的默认控制台编码是什么?它似乎有时是ANSI编码(CP-1252),有时是由chcp命令提供的OEM编码(默认情况下是西欧的CP-850)。

  • 命令行参数和环境变量触发ANSI编码(é = 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')“é
  • Python控制台和标准输入触发OEM编码(如果OEM编码为CP-850,则为é= 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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)开始。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49121900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档