栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python,Windows控制台和编码(cp 850 vs cp1252)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python,Windows控制台和编码(cp 850 vs cp1252)

回复自己:

在Windows上,控制台使用的编码(即sys.stdin / out的编码)不同于各种OS提供的字符串的编码-
通过os.getenv(),sys.argv等获得,当然还有更多。

sys.getdefaultencoding()提供的编码确实是这样-
一种默认值,由Python开发人员选择,以匹配解释器在极端情况下使用的“最合理的编码”。我在Python 2.6上获得了“
ascii”,并尝试了可移植的Python 3.1,产生了“ utf-8”。两者都不是我们想要的-它们只是编码转换函数的后备。

正如该页面所陈述的那样,操作系统提供的字符串所使用的编码由活动代码页(ACP)控制。由于Python没有本地函数来检索它,因此我不得不使用ctypes:

from ctypes import cdllos_encoding = 'cp' + str(cdll.kernel32.GetACP())

编辑:
但是正如Jacek所建议的那样,实际上还有一种更健壮和Pythonic的方式可以做到这一点(语义需要验证,但在证明错误之前,我将使用此方法)

import localeos_encoding = locale.getpreferredencoding()# This returns 'cp1252' on my system, yay!

接着

u_argv = [x.depre(os_encoding) for x in sys.argv]u_env = os.getenv('myvar').depre(os_encoding)

在我的系统上,

os_encoding ='cp1252'
它可以正常工作。我非常确定这会在其他平台上中断,因此请随时进行编辑并使它更通用。我们当然需要Windows报告的ACP与Python编码名称之间的某种转换表,这比仅在’cp’之前更好。

不幸的是,这是一种hack,尽管我发现它比该ActiveState代码食谱(与我的问题的编辑2中提到的SO问题相关联)所建议的侵入性要小。我在这里看到的优点是,它可以应用于os.getenv(),而不仅可以应用于sys.argv。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659498.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号