我正在创建用于Linux和Windows上的文件操作的库。所以我需要处理路径,主要要求是我的函数将收到UTF8格式的字符串。但它会导致一些问题,其中一个是我在Windows上使用MAX_PATH
而在linux中使用PATH_MAX
来表示静态路径变量。在ASCII字符的情况下没有问题,但是当路径包含unicode字符时,如果unicode char需要每个字符2个字节,则路径长度将缩短两倍,如果unicode char需要每个字符3个字节,则路径长度将减少3倍等等。那么这个问题有很好的解决方案吗?
提前致谢!
P.S。对不起我的英文。
答案 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,他们可以做到这一点,但没有人在文件系统中浪费那么多空间。可惜,那个。