Encoding python3中以字节而不是字符串形式显示的命令行参数
我正在编写一个python3程序,它从命令行参数获取要处理的文件名。我对处理不同编码的正确方法感到困惑 <>我想我宁愿把文件名看作字节而不是字符串,因为这样避免了使用错误编码的危险。事实上,我的一些文件名使用了不正确的编码(当我的系统区域设置使用utf-8时为拉丁文1),但这并不妨碍像ls这样的工具工作。我希望我的工具也能适应这种情况 我有两个问题:命令行参数以字符串的形式提供给我(我使用argparse),我想以字符串的形式向用户报告错误 我已经成功地将代码修改为使用二进制文件,并且我的工具可以处理在当前默认编码中名称无效的文件,只要通过文件系统递归即可,因为我很早就将参数转换为二进制文件,并且在调用fs函数时使用二进制文件。但是,当我收到一个无效的文件名参数时,它会作为带有奇怪字符的unicode字符串传递给我,如Encoding python3中以字节而不是字符串形式显示的命令行参数,encoding,python-3.x,filenames,command-line-arguments,Encoding,Python 3.x,Filenames,Command Line Arguments,我正在编写一个python3程序,它从命令行参数获取要处理的文件名。我对处理不同编码的正确方法感到困惑 我想我宁愿把文件名看作字节而不是字符串,因为这样避免了使用错误编码的危险。事实上,我的一些文件名使用了不正确的编码(当我的系统区域设置使用utf-8时为拉丁文1),但这并不妨碍像ls这样的工具工作。我希望我的工具也能适应这种情况 我有两个问题:命令行参数以字符串的形式提供给我(我使用argparse),我想以字符串的形式向用户报告错误 我已经成功地将代码修改为使用二进制文件,并且我的工具可以处
\udce8
。我不知道这些是什么,尝试编码总是失败的,无论是utf8编码还是相应的(错误的)编码(这里是拉丁语1)
另一个问题是报告错误。我希望我的工具的用户解析我的标准输出(因此希望保留文件名),但当在标准输出上报告错误时,我宁愿用utf-8编码它,用适当的“无效/问号”字符替换无效序列
所以
1) 有没有更好、完全不同的方法?(是的,修复文件名是有计划的,但我仍然希望我的工具是健壮的)
2) 我如何获得原始二进制形式的命令行参数(我没有预先解码),知道对于无效序列,重新编码解码的参数将失败,以及
3) 我如何告诉utf-8编解码器用一些无效的标记替换无效的、不可编码的序列,而不是死在我身上
当我收到文件名参数时
这是无效的,但是,它是
作为unicode字符串和
奇怪的字符,如\udce8
这些是代理角色。低8位是原始无效字节
请参阅。不要违反规则:文件名是字符串,而不是字节 当您应该使用
字符串时,不应该使用字节
。字节是整数的元组。字符串是字符的元组。它们是不同的概念。你所做的就像使用一个整数,而你应该使用一个布尔值
(旁白:Python将所有字符串存储在Unicode下的内存中;所有字符串的存储方式相同。编码指定Python如何将文件中的字节转换为这种内存格式。)
操作系统将文件名存储为特定编码下的字符串。我很惊讶你说有些文件名有不同的编码;据我所知,文件名编码是系统范围的。例如,open
等函数默认为默认系统文件名编码。好的,这解决了第2点。因此,正确的做法是在仅编码CLI参数时添加“代理场景”?或者使用代理工具将所有内容作为字符串处理?其他几点呢?至少我最担心的问题已经解决了,所以答案被接受了!Python3.1(而不是3.0)应该自动处理代理场景。我希望我的操作系统能将文件名视为字符串,但有很多事情表明情况并非如此。我尝试用不同的语言环境设置运行ls,但它仍然会给我相同的字节序列。如果区域设置与文件系统编码不同,则不会执行代码转换。我本来会在任何地方使用字符串(这是我最初做的),但它不起作用,现在我认为原因是我正在使用的一个lib(pyxattr)在处理代理时失败。