【问题标题】:NSURL is null while NSString is correct in Objective-CNSURL 为空,而 NSString 在 Objective-C 中是正确的
【发布时间】:2012-01-19 03:53:46
【问题描述】:

我有一个包含 url 的 NSString,当我用 NSString 分配 NSURL 时,NSURL 输出(空)。这是因为url中有一些非法字符,如果不对包含url的NSString进行编码,NSURL就无法读取。

NSString *u = [incomingUrlString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:u];

NSLog(@"INCOMINGURLSTRING: %@" , u);
NSLog(@"URL: %@" , url);

输出为:

 INCOMINGURLSTRING: /url/path/fileName_blå.pdf
 URL: (null)

incomingUrlString 包含挪威字母“å”,我认为这是 NSURL 为 (null) 的原因

我也试过这个:

NSString *trimmedString = [file stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSString *encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)trimmedString, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", kCFStringEncodingUTF8);

NSLog(@"TRIMMEDSTRING: %@" , trimmedString);
NSLog(@"ENCODEDSTRING: %@" , [encodedString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]);

NSURL *url = [NSURL URLWithString:encodedString];

NSLog(@"URL: %@" , url);

这里的输出是:

 TRIMMEDSTRING: /url/path/fileName_blå.pdf
 ENCODEDSTRING: /url/path/fileName_blå.pdf
 URL: %2Furl%2FPath%2FfileName_bl%C3%A5.pdf

我的目标是将 URL 加载到 UIWebView 中。它适用于除此之外的所有其他传入 url,除了文件名外,它们看起来都相同。这是唯一一个包含非法字符的。但我必须找到一种编码方式,因为将来会有更多包含“æ”、“ø”或“å”的文件。

我知道根据 url 标准,输出看起来不正确,这是我故意这样做的。由于安全原因,我无法使用http://blah blah 显示正确的网址。

谁能帮忙?

【问题讨论】:

  • 你试过用 stringByAddingPercentEscapesUsingEncoding: 代替 stringByReplacingPercentEscapesUsingEncoding:

标签: iphone objective-c ios xcode nsstring


【解决方案1】:

您用于对字符串中的字符进行百分比编码的方法也会转义合法的 URL 字符。如果您正在对 URL 参数进行编码,这将是合适的,但在这种情况下,最好简单地使用 stringByAddingPercentEscapesUsingEncoding:,因为它会留下属于 URL 结构一部分的字符(':'、'/' 等)完好无损:

NSString *u = @"http://example/path/fileName_blå.pdf";
u = [u stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:u];
NSLog(@"%@", url); // http://example.com/path/fileName_bl%C3%A5.pdf

【讨论】:

  • 不,不是;在您的第一个代码 sn-p 中,您调用的是 stringByReplacingPercentEscapes...。您可以将其与已包含百分比转义符的字符串一起使用,但您实际上想要相反的情况,stringByAddingPercentEscapes...
  • 哈哈,天哪,我很抱歉!我读错了,但是是的,你是对的。它解决了我的问题,非常感谢!
【解决方案2】:

如果您的 URL 是文件路径,则必须使用 + (id)fileURLWithPath:(NSString *)path。对于URLWithString: 方法,字符串必须包含类似file://http:// 的方案。

【讨论】:

  • 我知道,这不是问题所在。这就是为什么我写它适用于所有其他传入的 url。 url 看起来一样,除了文件名。
【解决方案3】:

stringByAddingPercentEscapesUsingEncoding 已弃用。

新的方法(iOS 7+)是:

NSString *encoded = [raw stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet];

文件路径由https://www.rfc-editor.org/rfc/rfc8089定义。
关键部分是允许字符./ 并禁止%CharacterSet.urlPathAllowed 符合要求。

您的示例输出:

传入字符串:/url/path/fileName_blå.pdf
编码字符串:/url/path/fileName_bl%C3%A5.pdf
网址:/url/path/fileName_bl%C3%A5.pdf

【讨论】:

    【解决方案4】:

    我还发现对于一些北欧字符,NSISOLatin1StringEncoding 更适合。

    - (void) testEncoding {
        NSString * urlString = @"http://example/path/fileName_blå.pdf";
        urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSISOLatin1StringEncoding];
        NSURL * url = [NSURL URLWithString:urlString];
        NSLog(@"URL: %@", url);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 2012-04-05
      • 2011-07-20
      • 2012-12-28
      • 1970-01-01
      • 2016-07-28
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多