C 处理路径长度的问题

C 处理路径长度的问题,c,utf-8,C,Utf 8,我正在创建一个库,它将用于linux和windows上的文件操作。所以我需要处理路径,主要要求是我的函数将接收UTF8格式的字符串。但是它会导致一些问题,其中之一是我在windows上使用MAX\u PATH,在linux上使用PATH\u MAX,来表示静态路径变量。在ASCII字符的情况下不会有问题,但是当路径包含unicode字符时,如果unicode字符要求每个字符2个字节,则路径长度将缩短两倍,如果unicode字符要求每个字符3个字节,则路径长度将缩短三倍,依此类推。那么这个问题有好

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

提前谢谢


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

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


因此,如果路径名包含>=0个多字节UTF-8字符,则表示最大路径长度(以字符为单位)为,这完全取决于您需要什么

如果希望最大路径数为字节,只需将缓冲区定义为
字符名[MAX\u PATH]
。如果需要
MAX\u PATH
字符数,可以将缓冲区定义为
char name[MAX\u PATH*4]
,因为UTF-8将每个Unicode字符编码为1到4个八位字节的可变数


简言之,正如janneb指出的,
MAX\u PATH(或PATH\u MAX)
指定了底层字节数而不是字符。

微软的路径名不是使用UCS-2或UTF-16,因此MAX\u PATH的长度反映了16位代码单位,甚至不是正确的字符

我知道Apple使用UTF-16,路径名中的每个组件最多可以有256个UTF-16代码单元而不是字符,而且它的标准化程度与很久以前的NFD相当

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


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

你不能定义PATH_MAX:它是一个系统常数,固定在文件系统中。是的,但这是最糟糕的情况。我不是想定义MAX_PATH/PATH_MAX(我从来没有提到过这些宏:),而是将自己的MAX PATH值定义为n*4是的,但是如果你将它们限制在习惯长度的¼,你不会让任何人高兴。您必须考虑编码(以及规范化,如果有的话)是否适合您所选择的文件系统。与其为每个字符使用n*4字节,不如使用动态字符串。“总之,…MAX_PATH(或PATH_MAX)指定基础字节数,而不是字符数。”我知道,我想要字符的最大路径,你上面提供的方法是最坏的情况,我想要更有效的方法,而不是为每个字符串分配4个*最大路径字节。如果你想要更有效的方法,那么就分配路径最大字节,因为系统无论如何都不能处理更长的路径,正如我在回答中所解释的。如果将较长的字符串作为库的输入,则需要返回错误,或截断字符串。这不是解决方案,因为对于unicode字符,我的库可以处理的路径长度将非常短。如果处理路径名称的长度超过系统本身能够处理的长度,则有人可能会问。或者反过来说,如果你不关心系统限制,为什么要首先讨论PATH_MAX?@janneb,我不理解你的第一个回答[其次我甚至不理解,我的英语不够好)],我想我会像你写的那样做,只有一个例外,我会检查路径中的字符数,而不是检查字节数。