是否有任何字符保证不会出现在Windows或Unix / Linux / OS X上的任何文件路径中?
我需要这个,因为我想将几个文件路径连接成一个字符串,然后再将它们分开。
答案 0 :(得分:2)
在评论中,哈里约翰斯顿写道:
此类问题的通用解决方案是在加入文件路径之前对其进行编码。例如,如果您正在处理单字节字符串,则可以将它们转换为十六进制字符串;所以“你好”变成了“68656c6c6f”。 (显然这不是最有效的解决方案!)
这绝对是正确的。 请不要尝试使用文件名和保留字符做任何“棘手”的事情,因为最终会在一些奇怪的角落案件中突破,你的继任者将有一段时间试图修复损坏。
事实上,如果您想要移植,我强烈建议您永远不要尝试创建任何文件名,包括除[a-z0-9_]
以外的任何字符。 (考虑到Windows和OS X上的公共文件系统可以在不区分大小写的模式下运行,其中FooBar.txt
和FOOBAR.TXT
是相同的标识符。)
实际使用的体积相当紧凑的编码方案是制作“白名单集”,例如[a-z0-9_]
,并将“白名单集”之外的任何字符ch
编码为printf("_%2x", ch)
。因此hello.txt
变为hello_2etxt
,hello_world.txt
变为hello_5fworld_2etxt
。
由于每个_
都已转义,因此您可以使用double - _
作为分隔符:编码字符串hello_2etxt__goodbye___2e_2e
唯一标识文件名列表['hello.txt', 'goodbye', '..']
。
答案 1 :(得分:1)
如果您愿意,可以使用换行符,特别是CR(十进制代码13)或LF(十进制代码10)。这是否合适取决于您对用户显示连接字符串的要求 - 使用这种方法,它将在不同的行上打印它们的部分 - 这可能是非常好或非常糟糕的目的(或者你可能不在乎......)。
如果您需要在一行上打印连接字符串,请编辑您的问题以指定此附加要求;我们可以从那里出发。