回复自己:
在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。



