stringByReplacingOccurrencesOfString无法按预期工作

时间:2011-02-17 18:12:24

标签: iphone cocoa-touch

遇到问题。这是我的代码:

Latitude = [TBXML textForElement:lat]; //Latitude & Longitude are both NSStrings
Longitude= [TBXML textForElement:lon];
NSLog(@"LAT:%@ LON:%@",Latitude,Longitude);
NSString *defaultURL = @"http://api.wxbug.net/getLiveWeatherRSS.aspx?ACode=000000000&lat=+&long=-&unittype=1";
newURL = [[defaultURL stringByReplacingOccurrencesOfString:@"+" 
                                                        withString:Latitude]
                                    stringByReplacingOccurrencesOfString:@"-" 
                                                        withString:Longitude];
NSLog(@"%@",newURL);

这是输出:

LAT:-33.92 LON:18.42 
http://api.wxbug.net/getLiveWeatherRSS.aspxACode=000000000&lat=18.4233.92&long=18.42&unittype=1

正如您所看到的,附加代码发生了一些奇怪的事情。我在这里做错了吗?

4 个答案:

答案 0 :(得分:7)

在替换经度之前,字符串是

http://....&lat=-33.92&long=-&...
                ^           ^

系统发现有两个-,因此它们都会被纬度所取代。


您应该使用更具描述性的字符串来代替,例如

NSString *defaultURL = @"http://....&lat={latitude}&long={longitude}&unittype=1";
newURL = [defaultURL stringByReplacingOccurrencesOfString:@"{latitude}" 
                                               withString:Latitude];
newURL = [newURL stringByReplacingOccurrencesOfString:@"{longitude}" 
                                           withString:Longitude];

或只使用+stringWithFormat:

NSString* newURL = [NSString stringWithFormat:@"http://....&lat=%@&long=%@&...",
                                              Latitude, Longitude];

答案 1 :(得分:3)

这是我们开始的地方:

url = @"http://...?ACode=000000000&lat=+&long=-&unittype=1"
Latitude = @"-33.92"
Longitude = @"18.42"

然后,您将所有@"+"替换为@"-33.92"

url = @"http://...?ACode=000000000&lat=-33.92&long=-&unittype=1"

然后,您将所有@"-"替换为@"18.42"请注意,有两个' - '字符;一个在lat=后面,一个在long= 之后。 'lat'之后的那个是因为你粘贴的字符串中有一个-

url = @"http://...?ACode=000000000&lat=18.4233.92&long=18.42&unittype=1"

因此,你的最终结果。

答案 2 :(得分:2)

@KennyTM,BJ Homer和madmik3都是正确的。你的价值被取代了两次。

但是,您应该技术上以完全不同的方式构建您的网址:

NSMutableDictionary *query = [NSMutableDictionary dictionary];
[query setObject:@"000000000" forKey:@"ACode"];
[query setObject:Latitude forKey:@"lat"];
[query setObject:Longitude forKey:@"long"];
[query setObject:@"1" forKey:@"unittype"];

NSMutableArray *queryComponents = [NSMutableArray array];
for (NSString *key in query) {
  NSString *value = [query objectForKey:key];
  key = [key stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
  value = [value stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];

  NSString *component = [NSString stringWithFormat:@"%@=%@", key, value];
  [queryComponents addObject:component];
}

NSString *queryString = [components componentsJoinedByString:@"&"];

NSString *fullURLString = [NSString stringWithFormat:@"http://api.wxbug.net/getLiveWeatherRSS.aspx?%@", queryString];
NSURL *newURL = [NSURL URLWithString:fullURLString];

(暂时忽略-stringByAddingPercentEscapesUsingEncoding:的效力)

更好的原因是,根据HTTP规范,the keys and values in the query of the URL应为URL encoded。当然,你只是为简单的密钥编码。但如果这种情况发生变化,您的URL可能会中断。 (这种方法的缺陷是它只允许每个键一个值,HTTP规范允许你指定多个值。为了简单起见,我把它留了出来)

使用-stringByAddingPercentEscapesUsingEncoding:时也存在一些问题。有关详细信息,请查看Objective-c iPhone percent encode a string?

答案 3 :(得分:1)

你的LAT是否定的。所以 - 被替换了两次。