我已经看过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'
? (首选双语解决方案)
在中,有效结果包括:
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脚本的实际字节 - 无论它们有多随意。
答案 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%的用例中,它都能正常工作