Objective-C NSURL具有非字母字符

时间:2014-06-07 06:55:14

标签: ios objective-c xcode nsurl non-ascii-characters

我正在尝试创建一个带有特殊字符的NSURL,如“”,“|”,“ - ”,“:”等。如果我的字符串中有任何这些字符,则NSURL不会初始化。如何使用这些字符创建NSURL?以下不起作用:

NSURL *url = [[NSURL alloc] initWithString:@"http://google.com?id=|test|"]; //if i remove the | it works. 

3 个答案:

答案 0 :(得分:8)

问题描述

来自[NSURL initWithString]

的文档
  

使用提供的URL字符串初始化NSURL对象。

     

- (id)initWithString:(NSString *)URLString

     

参数 - URLString

     

用于初始化NSURL对象的URL字符串。 此网址   string必须符合RFC 2396中描述的URL格式,并且必须符合   不是nil。此方法根据RFC 1738和。解析URLString   1808.

     

返回值

     

使用URLString初始化的NSURL对象。如果URL字符串是   格式错误,返回无。

     

讨论

     

此方法要求URLString仅包含字符   允许在正确形成的URL中。所有其他角色必须是   正确的百分比转义。任何转义百分比的字符都是   使用UTF-8编码解释。

解决方案

您需要先将字符串编码为url。其中一个解决方案就是使用 [NSString stringByAddingPercentEscapesUsingEncoding:] [1]

关于将字符串编码为url的Stackoverflow还有其他讨论:

  1. iOS : How to do proper URL encoding?
  2. How do I URL encode a string

答案 1 :(得分:3)

你应该使用ASCII值“|” :即%7C。您无法直接使用这些类型的特殊字符。

    NSURL *url = [[NSURL alloc] initWithString:@"http://google.com?id=%7Ctest%7C"];

我希望它能奏效。

答案 2 :(得分:2)

它不起作用的原因是因为它们不是URL的直接合法字符。

这取自对(实际上)关于SO的相关问题的精彩答案:Which characters make a URL invalid?

“通常由RFC 3986定义的网址(请参阅Section 2: Characters)可能包含以下任何字符:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 -._〜:/?#[] @!$&'() *,;; =。任何其他字符都需要使用百分比编码(%hh)进行编码.URI的每个部分都有进一步限制,需要用百分比编码的字来表示哪些字符。“

然而在实践中,你不应该在URL中使用逗号或方括号或时髦的东西 - 你不知道哪些浏览器会正确处理它。绝对没有充分的理由在URL中使用任何时髦的字符 - 即使它是本地文件的URL。

是的,使用NSURL URLWithString对Objective-C来说是一个更好的策略,但主要做的是坚持使用URL的注意事项。