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

时间:2010-10-25 07:23:48

标签: python encoding argv sys

在Python中,sys.argv的元素是什么编码?它们是用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元素?)

7 个答案:

答案 0 :(得分:8)

我猜你问这是因为你遇到了issue 2128。请注意,这已在Python 3.0中修复。

答案 1 :(得分: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)

我不知道这是否有帮助,但这是我在DOS模式下得到的:

C:\Python27>python Lib\codingtest.py нер
['Lib\\codingtest.py', '\xed\xe5\xf0']

C:\Python27>python Lib\codingtest.py hello
['Lib\\codingtest.py', 'hello']

在IDLE:

>>> print "hello"
hello
>>> "hello"
'hello'
>>> "привет"
'\xef\xf0\xe8\xe2\xe5\xf2'
>>> print "привет"
привет
>>> sys.getdefaultencoding()
'ascii'
>>> 

我们可以从中推断出什么?我还不知道......我会稍微评论一下。

稍后sys.argv使用sys.stdin.encoding进行编码而非sys.getdefaultencoding()

答案 3 :(得分:4)

在Unix系统上,它应该在用户的语言环境中,(奇怪地)不与sys.getdefaultencoding绑定。请参阅http://docs.python.org/library/locale.html

在Windows中,它将位于系统ANSI代码页中。

(顺便说一句,那些告诉你不要以介词结束判决的小学老师对你撒谎。)

答案 4 :(得分:4)

“Windows应该做什么(以便在控制台的任何地方正确解释sys.argv元素)?”

对于Python 2.x,请参阅this comment on issue2128

(请注意, no 编码对于原始sys.argv是正确的,因为某些字符可能已被破坏,因为没有足够的信息可以撤消;例如,如果ANSI代码页不能表示希腊语alpha然后它将被修改为'a'。)

答案 5 :(得分:0)

sys.getfilesystemencoding()适用于我,至少在Windows上。 在Windows上它实际上是' mbcs'和' utf-8'在* nix。

答案 6 :(得分:0)

根据https://docs.python.org/3/library/sys.html#sys.argv

argv 使用 sys.getfilesystemencodeerrors() 使用 sys.getfilesystemencoding() 进行编码。

另请参阅 https://www.python.org/dev/peps/pep-0383/,它解释了在 encoding="utf-8" ... 使用 surrogateescape 作为错误处理程序时,非 UTF8 序列如何在其中编码 (UTF-8) 的棘手方式。< /p>

感兴趣的也可能是 os.fsdecode 和 os.fsencode。