Python:使用哪种编码来处理sys.argv?

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元素)?

Wim*_*nen 8

我猜你问的是因为你遇到了问题2128.请注意,这在Python 3.0中已得到修复.


Joh*_*hin 6

一些观察:

(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永不失败的信任.

  • 我同意(2) - 我后来想到了.(5)实际上不是真的:在Unix下,`python test.py> test.txt`可以为stdin编码提供UTF-8,为stdout编码提供None. (4认同)

sou*_*kah 5

我不知道这是否有帮助,但这是我在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.argvsys.stdin.encoding和不用编码sys.getdefaultencoding()


Dai*_*ood 4

“Windows 应该做什么(以便无论控制台如何正确解释 sys.argv 元素)?”

对于 Python 2.x,请参阅issues2128 上的评论

(请注意,对于原始 sys.argv,没有正确的编码,因为某些字符可能已被破坏,而没有足够的信息可以撤消;例如,如果 ANSI 代码页无法表示希腊字母,那么它将被破坏为 ' A'。)