代码之家  ›  专栏  ›  技术社区  ›  b0fh

python3中的命令行参数是字节而不是字符串

  •  2
  • b0fh  · 技术社区  · 16 年前

    我正在编写一个python3程序,它从命令行参数中获取要处理的文件名。我对处理不同编码的正确方法感到困惑。

    我想我宁愿把文件名看作字节而不是字符串,因为这样可以避免使用不正确编码的危险。实际上,我的一些文件名使用了不正确的编码(当系统区域设置使用UTF-8时,使用Latin1),但这并不能阻止像ls这样的工具工作。我希望我的工具也能适应这种情况。

    我有两个问题:命令行参数作为字符串提供给我(我使用argparse),我想以字符串的形式向用户报告错误。

    我已经成功地修改了代码以使用二进制文件,并且我的工具可以通过文件系统递归来处理当前默认编码中名称无效的文件,因为我很早就将参数转换为二进制文件,并在调用fs函数时使用二进制文件。但是,当我收到一个无效的文件名参数时,它会作为一个Unicode字符串传递给我,其中包含一些奇怪的字符,比如 \udce8 . 我不知道这些是什么,而且试图对其进行编码总是失败的,不管是使用UTF8还是使用相应的(错误的)编码(这里是Latin1)。

    另一个问题是报告错误。我希望我的工具的用户解析我的stdout(因此希望保留文件名),但是当报告stderr上的错误时,我宁愿用utf-8编码,用适当的“无效/问号”字符替换无效的序列。

    所以,

    1)有没有更好的,完全不同的方法?(是的,修复文件名是有计划的,但我仍然希望我的工具是健壮的)

    2)我如何获得原始二进制形式的命令行参数(不是预先为我解码),知道对于无效序列,重新编码解码的参数将失败,以及

    3)如何告诉UTF-8编解码器用一些无效标记替换无效的、不可编码的序列,而不是死在我身上?

    2 回复  |  直到 16 年前
        1
  •  2
  •   dan04    16 年前

    但是,它是无效的 以unicode字符串的形式传递给我 奇怪的字符,如\udce8。

    这些是代理角色。低8位是原始无效字节。

    PEP 383: Non-decodable Bytes in System Character Interfaces .

        2
  •  -1
  •   Humphrey Bogart    16 年前

    不要违背粒度:文件名是字符串,而不是字节。

    你不应该使用 bytes 当你应该使用 string . 一 字节 是整数的元组。一 一串 是一组字符。它们是不同的概念。你所做的就像使用一个整数,而你应该使用一个布尔值。

    (旁白:python在unicode下将所有字符串存储在内存中;所有字符串的存储方式都相同。encoding指定python如何将文件字节转换为内存格式。)

    您的操作系统将文件名存储为特定编码下的字符串。我很惊讶你说有些文件名有不同的编码;据我所知,文件名编码是全系统的。函数类 open 例如,默认为默认的系统文件名编码。