2010-10-25 72 views
22

在Python中,什么编码是sys.argv的元素?他们是用sys.getdefaultencoding()编码编码的吗?Python:哪个编码用于处理sys.argv?

sys.getdefaultencoding():返回Unicode实现使用的当前默认字符串编码的名称。

PS:由于在一些问题的答案中指出,sys.stdin.encoding的确会是一个更好的猜测。我很想看到这个问题的明确答案,但是,指向可靠的消息来源!如Wim指出的,Python 3通过将str对象放在sys.argv中(如果我理解正确的话)解决了这个问题。但是,Python 2.x仍然是个问题。在Unix下,LC_CTYPE环境变量似乎是正确的检查,不是吗? Windows应该做些什么(这样sys.argv元素可以正确解释任何控制台)?

回答

3

“Windows应该做些什么(因此sys.argv元素可以正确解释控制台的任何内容)?”

对于Python 2.x,请参阅this comment on issue2128。 (注意没有编码对于原始sys.argv是正确的,因为某些字符可能已经以没有足够信息撤销的方式被破坏;例如,如果ANSI代码页不能表示希腊字母,那么它将被修改为'a')。

+0

标记为已接受:对第2128期的这一新评论是新信息!谢谢! – EOL 2011-01-10 09:00:25

4

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

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

(顺便说一句,那些小学教师谁告诉你不结束与介词在骗你的句子。)

+0

摇摇晃晃的介词是我不会放的东西。对摇晃的介词的所谓狭窄显然是从对风格的观察演变而来的。换句话说,一个句子的第一个和最后一个单词是那些具有最自然影响的单词。因此,仅仅把介词置于这样一个战略重要的位置,就被认为是文体上的弱点。 – 2010-11-05 21:16:30

+0

@Jim:风格一切都很好,但有些人似乎有这个愚蠢的概念,它不合语法,导致这样的愚蠢作为这个问题的标题。 – 2010-11-05 21:28:44

+0

这个问题的标题似乎很清楚,尽管我可能会建议使用* which而不是“what”。更精确的措辞可能是:“哪个编码用于处理sys.argv?”在保留一些简单的ASCII字符串处理的同时,所有这些试图容纳国际字符集的尝试都使文本编码的整个问题变得相当复杂。围绕整个事件的术语变得同样令人费解。 – 2010-11-06 12:13:19

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()

+0

\ xef是SMALL LETTER PE('п')的UNICODE CP1251西里尔语表示,因此我开始相信'sys.argv'编码有'sys.stin.encoding'而不是'sys.getdefaultencoding() ' – soulseekah 2010-10-25 08:02:39

4

几个意见:

(1)这当然不是sys.getdefaultencoding

(2)sys.stdin.encoding似乎是一个更好的选择。 (3)在Windows上,sys.stdin.encoding的实际值会有所不同,具体取决于软件提供的stdio。 IDLE将使用系统“ANSI”代码页,例如在西欧和美国的大部分地区以及前殖民地都有。但是,在模拟MS-DOS的命令提示符窗口中,默认情况下会使用相应的旧DOS代码页(例如cp850)。这可以通过使用CHCP(更改代码页)命令进行更改。

(4)子流程​​模块的文档没有提供关于args和stdout使用什么编码的建议。

(5)一个人相信assert sys.stdin.encoding == sys.stdout.encoding永远不会失败。

+0

观察结果似乎是正确的,我也观察到了相同的结果。你知道sys.getdefaultencoding究竟返回什么吗? – 2010-10-25 09:55:34

+0

“它返回Unicode实现使用的当前默认字符串编码的名称。”我认为这意味着Python在其控制台中使用了defaultencoding()。您可以通过预先设置u''来覆盖defaultencoding()。很好的答案+1 – soulseekah 2010-10-25 11:38:33

+4

我同意(2) - 我后来想到了。 (5)实际上并非如此:在Unix下,'python test.py> test.txt'例如可以使用UTF-8作为stdin编码,而使用None作为stdout编码。 – EOL 2010-10-25 15:32:46

7

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

+0

谢谢,我会检查链接。在写一个从命令行接收用户消息的程序之前,我实际上是在预防性地提出这个问题。 – EOL 2010-11-03 21:35:05

+0

Python 2.x呢?和Windows? – EOL 2010-11-09 15:46:58

0

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