在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元素?)
答案 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。