Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 从NSString创建安全文件名?_Iphone_Ios_Ios4_Nsstring - Fatal编程技术网

Iphone 从NSString创建安全文件名?

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转换成一个安全版本,可以作为文件名保存到iPhone上的用户文档目录中

我目前正在做这样的事情:

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所有随机文件名。