我想在文件名中编码一个简短的标题。问题是,有时标题会包含冒号或斜杠等字符。是否有一个标准的编码是典型的/适合的?
编辑:为了澄清,我想对标题进行编码,使编码的标题可以用作文件名。或者这叫做百分比逃逸?
我这样做的方法是在NSURL上使用一个类别,我用它来获取特定目录中文件名的NSURL。一旦我有了这个NSURL,我就可以在执行关于文件是否已经存在的常规检查并相应地处理这些情况之后,使用该URL获取或保存文件。
相关代码片段为:
+ (NSURL *)adnURLForFileName:(NSString *)fileName inDirectory:(NSSearchPathDirectory)searchDirectory {
NSString *percentEscapedFileName = [fileName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *URLForDirectory = [[fileManager URLsForDirectory:searchDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
return [NSURL URLWithString:percentEscapedFileName relativeToURL:URLForDirectory];
}
您可以从GitHub下载完整的类别代码-NSURL+ADNFileHelpers
您可以使用-stringByReplacingOccurrencesOfString:withString:
将斜杠字符替换为U+2044,即"solidus",也就是"fraction slash"。它看起来像这样:⁄
http://en.wikipedia.org/wiki/Solidus_(标点符号)
Unix API中不允许使用斜线。在HFS和旧的文件管理器API中不允许使用冒号。相同的文件名字符在前者中显示为冒号,在后者中显示为斜杠。在实践中:您可以使用Finder将文件重命名为"/"(因为Finder使用传统的Mac分隔符:
),但如果您使用ls
,它将显示为":"。
如果需要同时允许冒号和斜杠,则需要以某种方式对字符进行编码。你可以使用URL样式的转义,但如果你希望用户在Finder或其他程序中查看文件名,那看起来会很糟糕。最好只跳过路径分隔符。例如,如果使用Unix风格的API(路径分隔符/
),则可以将/
编码为:-
,将:
编码为::
(以避免歧义)。或者你可以用其他一些不常用的角色来逃脱。
我已经通过在文件名中使用标题之前过滤标题来解决这个问题。NSString
有一些有用的方法,如stringByStandardizingPath
和stringByReplacingOccurrencesOfString:withString
:。过滤方法是有损耗的,因为原始标题信息可能无法恢复。同样,我认为编码也不起作用,因为iOS允许在文件名中使用如此广泛的字符。一种可能的替代解决方案可以是plist
归档,其中key=filename,value=title。