24

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 元素在任何控制台都被正确解释)?

4

7 回答 7

8

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

于 2010-11-03T09:44:46.523 回答
6

几点观察:

(1) 当然不是sys.getdefaultencoding

(2)sys.stdin.encoding似乎是一个更好的选择。

(3) 在 Windows 上,实际值sys.stdin.encoding会有所不同,具体取决于提供 stdio 的软件。IDLE 将使用系统“ANSI”代码页,例如cp1252在大部分西欧和美国及其前殖民地。然而,在或多或少模拟 MS-DOS 的命令提示符窗口中,将默认使用相应的旧 DOS 代码页(例如 cp850)。这可以通过使用 CHCP(更改代码页)命令进行更改。

(4) subprocess 模块的文档没有提供关于 args 和 stdout 使用什么编码的任何建议。

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

于 2010-10-25T09:38:42.893 回答
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']

在空闲时:

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

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

稍后:用而不是sys.argv编码sys.stdin.encodingsys.getdefaultencoding()

于 2010-10-25T07:46:02.247 回答
4

在 Unix 系统上,它应该在用户的区域设置中,(奇怪的是)不绑定到sys.getdefaultencoding. 请参阅http://docs.python.org/library/locale.html

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

(顺便说一句,那些告诉你不要用介词结束句子的小学老师是在骗你。)

于 2010-10-25T07:34:14.637 回答
4

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

对于 Python 2.x,请参阅关于 issue2128 的评论

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

于 2011-01-10T01:37:24.733 回答
1

根据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" 时如何在 (UTF-8) 中编码非 UTF8 序列的棘手方式。 .. 通过使用 surrogateescape 作为错误处理程序。

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

于 2021-01-31T05:53:54.750 回答
0

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

于 2016-12-09T16:18:33.337 回答