Iphone 从NSString创建安全文件名?
有没有办法将NSString转换成一个安全版本,可以作为文件名保存到iPhone上的用户文档目录中 我目前正在做这样的事情:Iphone 从NSString创建安全文件名?,iphone,ios,ios4,nsstring,Iphone,Ios,Ios4,Nsstring,有没有办法将NSString转换成一个安全版本,可以作为文件名保存到iPhone上的用户文档目录中 我目前正在做这样的事情: NSString *inputString = @"This is sample text which may have funny chars and spaces in."; NSInteger len = [inputString length]; NSString *newFilename = [[inputString substringToI
NSString *inputString = @"This is sample text which may have funny chars and spaces in.";
NSInteger len = [inputString length];
NSString *newFilename = [[inputString substringToIndex:MIN(20, len)] stringByAppendingPathExtension:@"txt"];
目前,这给我留下了如下印象:
This is sample text .txt
需要确保文件名中不允许的字符也被删除。您可能会遇到一些正则表达式之类的东西。仅仅是因为使用
除外的过滤器太危险(您可能会错过一些非法字符)
因此,我建议您使用RegexKitLite(http://regexkit.sourceforge.net/RegexKitLite/),并结合以下代码行:
inputString = [inputString stringByReplacingOccurencesOfRegex:@"([^A-Za-z0-9]*)" withString:@""];
这将替换除A-Z、A-Z和0-9=)之外的所有字符 你也可以用老式的方法来代替正则表达式:
NSString* SanitizeFilename(NSString* filename)
{
NSMutableString* stripped = [NSMutableString stringWithCapacity:filename.length];
for (int t = 0; t < filename.length; ++t)
{
unichar c = [filename characterAtIndex:t];
// Only allow a-z, A-Z, 0-9, space, -
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9') || c == ' ' || c == '-')
[stripped appendFormat:@"%c", c];
else
[stripped appendString:@"_"];
}
// No empty spaces at the beginning or end of the path name (also no dots
// at the end); that messes up the Windows file system.
return [stripped stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
NSString*SanitizeFilename(NSString*filename)
{
NSMutableString*stripped=[NSMutableString stringWithCapacity:filename.length];
for(int t=0;t 如果((c>='a'&&c='a'&&c='0'&&c如果您真正需要的是一个安全的随机文件名,那么只需使用SecRandomCopyBytes到您想要的长度并对其进行base64编码即可。我希望重新打开此问题。您所指的重复问题没有被接受的答案,因为提供的答案都没有正确回答。I重新打开此。引用的副本自2010年9月以来一直未激活(在'09年询问),没有可接受的答案,也没有最近的活动。在这种情况下,它只是阻止了另一个非常好的问题。在这种情况下,可能会更好地将重复的问题与此合并,其中可能会出现可接受的答案。抱歉,Chris,但base 64中确实包含例如“+”、“/”以及可能的“=”字符,因此至少,这不是一个(完整的)解决方案。十六进制可能会完成这项工作。我只是不断生成随机字节并进行编码,直到得到一个没有任何字符的字节。它从来不会占用多个额外的循环。这也有点奇怪,你可能只是选择一个0到61之间的随机数,然后选择一个没有/或+字符的基64字符,但我不认为asker的目标是n所有随机文件名。