处理路径长度的问题

时间:2011-08-18 11:45:26

标签: c utf-8

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

提前致谢!

P.S。对不起我的英文。

4 个答案:

答案 0 :(得分:3)

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

因此,如果路径名包含> = 0多字节UTF-8字符,那么它只表示字符中的最大路径长度为< = PATH_MAX。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

我知道Apple使用的是UTF-16,并且路径名中的每个组件最多可以包含256个UTF-16 代码单元而不是字符,并且它标准化为接近NFD的东西过去。

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

当你进行这种比较时,关键是要记住Unix使用8位代码单元,微软和Apple使用16位代码单元,并且似乎没有人愿意实际使用抽象字符。如果他们使用UTF-32,他们可以做到这一点,但没有人在文件系统中浪费那么多空间。可惜,那个。