【问题标题】:Problem with handling path length处理路径长度的问题
【发布时间】:2011-08-18 11:45:26
【问题描述】:

我正在创建库,用于在 linux 和 windows 上进行文件操作。所以我需要处理路径,主要要求是我的函数将接收 UTF8 格式的字符串。但这会导致一些问题,其中之一是我在 Windows 上使用 MAX_PATH 在 linux 上使用 PATH_MAX 来表示静态路径变量。在ASCII字符的情况下没有问题,但是当path包含unicode字符时,如果unicode char需要2个字节/ char,则路径长度将缩短两倍,如果unicode char需要3个字节/char,则路径长度将缩短3倍,依此类推.那么这个问题有好的解决方案吗?

提前致谢!

附言对不起我的英语。

【问题讨论】:

    标签: c utf-8


    【解决方案1】:

    至少在 Linux 上,您的担心似乎是错误的。 Linux(以及一般的 POSIX)将路径视为以“\0”结尾的不透明字节块。它不关心这些字节如何转换为字符。也就是说,PATH_MAX 以字节而不是字符为单位指定路径名的最大长度。

    因此,如果路径名包含 >= 0 个多字节 UTF-8 字符,则仅表示字符的最大路径长度为

    【讨论】:

      【解决方案2】:

      UTF-8 是多字节编码格式,每个字符 1 到 4 个字节。 由于您想静态定义最大路径值,您可能需要将最大路径定义为n*4(其中n 是您要定义的ASCII 字符的路径长度)以适应UTF-8 编码字符。

      【讨论】:

      • 你不能定义PATH_MAX:它是一个系统常量,固定在文件系统中。
      • 是的,但这是最坏的情况
      • 我并不是要定义 MAX_PATH/PATH_MAX(我从来没有提到这些宏 :))而是将自己的最大路径值定义为 n*4
      • 嗯,是的,但是如果你把它们限制在他们习惯长度的 1/4,你将不会让任何人高兴。您必须考虑适合您不是任何文件系统的编码(和规范化,如果有的话)。
      • 每个字符不要使用 n*4 字节,恕我直言,最好使用动态字符串字符。
      【解决方案3】:

      这完全取决于你需要什么。

      如果您想要 MAX_PATH 的 字节数,您只需将缓冲区定义为 char name[MAX_PATH]。如果您想要MAX_PATH 字符 的数量,请将缓冲区定义为char name[MAX_PATH * 4],因为 UTF-8 将每个 Unicode 字符编码为 1 到 4 个八位字节的可变数量.

      总之,正如 janneb 指出的那样,MAX_PATH (or PATH_MAX) 指定底层字节数而不是字符。

      【讨论】:

      • “总之,... MAX_PATH(或 PATH_MAX)指定底层字节数而不是字符数。”我知道,我想要 MAX_PATH 的字符,你上面提供的方法是最坏的情况,我想要更有效的方法,而不是为每个字符串分配 4*MAX_PATH 字节。
      • 如果您想要更有效的东西,请分配 PATH_MAX 字节,因为系统无论如何都无法处理更长的路径,如我的回答中所述。如果您将较长的字符串作为库的输入,则需要返回错误或截断字符串。
      • 这不是解决方案,因为在 unicode 字符的情况下,我的 lib 可以处理的路径长度将非常短。
      • 处理长于系统自身能力的路径名有什么价值,可能有人会问。或者相反,如果您不关心系统限制,为什么要首先讨论 PATH_MAX?
      • @janneb,我误解了你的第一个回复[第二个我什至不明白,我的英语不够好)],我想我会像你写的那样做,只有一个例外,我将检查路径中的字符数,而不是检查字节数。
      【解决方案4】:

      Microsoft 不使用 UCS-2 或 UTF-16 作为其路径名,因此 MAX_PATH 的长度反映了 16 位 代码单元,甚至没有正确的字符?

      我知道 Apple 使用 UTF-16,并且路径名中的每个组件最多可以是 256 个 UTF-16 代码单元而不是字符,并且它从很长的过去。

      如果有必要,我怀疑您必须首先进行规范化,例如 Apple 的 NFD,然后编码为您的本机文件系统的内部格式,然后检查长度。

      当您进行比较时,请务必记住 Unix 使用 8 位代码单元,Microsoft 和 Apple 使用 16 位代码单元,而且似乎没有人会费心实际使用抽象字符。如果他们使用 UTF-32,他们可以做到这一点,但没有人会在文件系统中浪费那么多空间。可惜了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-11
        • 2016-10-06
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多