【发布时间】:2011-04-03 05:42:21
【问题描述】:
我正在编写一个 python3 程序,它从命令行参数获取要处理的文件名。我对处理不同编码的正确方法感到困惑。
我认为我宁愿将文件名视为字节而不是字符串,因为这样可以避免使用不正确编码的危险。事实上,我的一些文件名使用了不正确的编码(当我的系统语言环境使用 utf-8 时为 latin1),但这并不妨碍像 ls 这样的工具工作。我希望我的工具也能适应这种情况。
我有两个问题:命令行参数以字符串形式提供给我(我使用 argparse),我想以字符串形式向用户报告错误。
我已经成功地调整了我的代码以使用二进制文件,并且我的工具可以处理名称在当前默认编码中无效的文件,只要它是通过文件系统递归,因为我很早就将参数转换为二进制文件,并在调用 fs 函数时使用二进制文件。但是,当我收到一个无效的文件名参数时,它会作为带有 \udce8 之类的奇怪字符的 unicode 字符串交给我。我不知道这些是什么,并且尝试对其进行编码总是失败,无论是使用 utf8 还是使用相应的(错误)编码(此处为 latin1)。
另一个问题是报告错误。我希望我的工具的用户能够解析我的标准输出(因此想要保留文件名),但是当报告标准错误时,我宁愿将其编码为 utf-8,用适当的“无效/问号”字符替换无效序列。
所以,
1) 有更好的、完全不同的方法吗? (是的,已计划修复文件名,但我仍然希望我的工具功能强大)
2) 我如何获取原始二进制形式的命令行参数(未为我预解码),知道对于无效序列重新编码已解码的参数将失败,并且
3) 我如何告诉 utf-8 编解码器用一些无效标记替换无效的、不可解码的序列而不是死在我身上?
【问题讨论】:
标签: encoding python-3.x filenames command-line-arguments