如何在Py3中检索argv ORIGINAL字节数据?

时间:2018-05-22 19:33:25

标签: python-3.x character-encoding

我已经看过Access command line arguments as bytes in python 3;这不能回答我的问题。

例如,\xff字符不会在sys.getfilesystemencoding()=='utf-8'时传递,如果我手动指定,则\u236a等字符无法通过latin-1

我需要做什么来编码字符串

u'123\xffABC\u263a\x00'

b'123\xffABC\xe2\x98\xba\x00'

Python 3中的

? (首选双语解决方案)

中,有效结果包括:

  • b'123\xc3\xbfABC\xe2\x98\xba\x00'
  • codec can't encode character '\u236a' in position 7: ordinal not in range(256)
  • b'123\xffABC\x00'
  • b'123ABC\xe2\x98\xba\x00'
  • b'123ABC\xe2\x98\xba'

在错误地将此问题标记为“重复”之前,请查看您建议的副本返回哪些无效结果。

作为参考,我试图检索最初传递给python脚本的实际字节 - 无论它们有多随意。

1 个答案:

答案 0 :(得分:0)

对于非边缘情况:

如果argv近似合理的命令行参数,则以下内容应该是可行的(也是最惯用的方式来引导它们):

list(map(os.fsencode, sys.argv))

(以下讨论中的h / t vstinner)

对于边缘情况:不可能+ wontfix

请参阅https://bugs.python.org/issue8776

上的讨论

或者,对于懒惰但又好奇的人,相关摘录(强调+格式添加):

  

[msg106172]

     

Py_Main期望wchar_t*,因此没有字节表示形式的   命令行随时可用。

     

[-Martin v。Löwis]

  

[msg217416]

     

今天,我很后悔os.environb(我添加了它)。如果我没记错的话,在PEP 383(os.environb)之前添加了surrogateescape。该PEP使得os.environb几乎没有用。在Python 3中,Unicode是很自然的选择,并且由于PEP 383,仍然可以使用任何“原始字节”。

     

argvb可以一行计算:list(map(os.fsencode, sys.argv))

     

我现在建议关闭[bytes版本的sys.argv]作为wontfix。

     

[-STINNER Victor]

虽然他的“一行”在极端情况下失败(例如,真argv的元素包含一个字节串,例如0x313233c3bf414243c3a2c298c2ba00),但在99.9%的用例中,它都能正常工作