Eri*_*got 24 python encoding sys argv
sys.argvPython 中的元素是什么编码?他们用sys.getdefaultencoding()编码编码?
sys.getdefaultencoding():返回Unicode实现使用的当前默认字符串编码的名称.
PS:正如一些答案所指出的那样,sys.stdin.encoding确实是一个更好的猜测.不过,我很想看到这个问题的确切答案,指出固体来源!
PPS:正如Wim所指出的,Python 3通过str在sys.argv中放置对象来解决这个问题(如果我理解的话).但问题仍然是Python 2.x的问题.在Unix下,LC_CTYPE环境变量似乎是正确的检查,不是吗?应该用Windows做什么(这样无论控制台如何都能正确解释sys.argv元素)?
一些观察:
(1)当然不是sys.getdefaultencoding.
(2)sys.stdin.encoding似乎是一个更好的赌注.
(3)在Windows上,实际值sys.stdin.encoding会有所不同,具体取决于提供stdio的软件.IDLE将使用系统"ANSI"代码页,例如cp1252在大多数西欧和美国及其前殖民地.但是,在命令提示符窗口中,或多或少地模拟MS-DOS,默认情况下将使用相应的旧DOS代码页(例如cp850).可以使用CHCP(更改代码页)命令更改此设置.
(4)子进程模块的文档没有提供有关用于args和stdout的编码的任何建议.
(5)一个assert sys.stdin.encoding == sys.stdout.encoding永不失败的信任.
我不知道这是否有帮助,但这是我在DOS模式下得到的:
C:\Python27>python Lib\codingtest.py ???
['Lib\\codingtest.py', '\xed\xe5\xf0']
C:\Python27>python Lib\codingtest.py hello
['Lib\\codingtest.py', 'hello']
Run Code Online (Sandbox Code Playgroud)
在IDLE:
>>> print "hello"
hello
>>> "hello"
'hello'
>>> "??????"
'\xef\xf0\xe8\xe2\xe5\xf2'
>>> print "??????"
??????
>>> sys.getdefaultencoding()
'ascii'
>>>
Run Code Online (Sandbox Code Playgroud)
我们可以从中推断出什么?我还不知道......我会稍微评论一下.
稍后:sys.argv用sys.stdin.encoding和不用编码sys.getdefaultencoding()
“Windows 应该做什么(以便无论控制台如何正确解释 sys.argv 元素)?”
对于 Python 2.x,请参阅issues2128 上的评论。
(请注意,对于原始 sys.argv,没有正确的编码,因为某些字符可能已被破坏,而没有足够的信息可以撤消;例如,如果 ANSI 代码页无法表示希腊字母,那么它将被破坏为 ' A'。)