Để mã hóa cộng (% 2B) (Nó hoạt động với tất cả charcters) sử dụng CFURLCreateStringByAddingPercentEscapes
như
/**
get parameterized url from url and query parameters.
*/
+(NSString *)getParameterizedUrl:(NSString *)url withParameters:(NSDictionary *)queryDictionary
{
NSMutableArray *mutablePairs = [NSMutableArray array];
for (NSString *key in queryDictionary) {
[mutablePairs addObject:[NSString stringWithFormat:@"%@=%@", CTPercentEscapedQueryStringKeyFromStringWithEncoding(key, NSUTF8StringEncoding), CTPercentEscapedQueryStringValueFromStringWithEncoding(queryDictionary[key], NSUTF8StringEncoding)]];
}
return [[NSString alloc]initWithFormat:@"%@?%@",url,[mutablePairs componentsJoinedByString:@"&"]];
}
static NSString * const kCharactersToBeEscapedInQueryString = @":/?&=;[email protected]#$()',*";
static NSString * CTPercentEscapedQueryStringKeyFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
static NSString * const kCharactersToLeaveUnescapedInQueryStringPairKey = @"[].";
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, (__bridge CFStringRef)kCharactersToLeaveUnescapedInQueryStringPairKey, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}
static NSString * CTPercentEscapedQueryStringValueFromStringWithEncoding(NSString *string, NSStringEncoding encoding) {
return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)kCharactersToBeEscapedInQueryString, CFStringConvertNSStringEncodingToEncoding(encoding));
}
Và sử dụng trong mã của bạn như
NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
[params setObject:@"2009-05-04T11:22:00+01:00" forKey:@"timestamp"];
NSString *urlString = [self getParameterizedUrl:@"http://www.example.com" withParameters:params];
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
Nguồn
2015-06-29 10:50:20
Tôi không hiểu câu trả lời đúng như thế nào. Các câu hỏi sẽ hỏi cách tạo một đối tượng NSURL thích hợp. Nếu chuỗi này được sử dụng để tạo đối tượng NSURL, dấu% sẽ lại được mã hóa dưới dạng% 25. Vui lòng làm rõ. –
Điều này giải quyết được vấn đề. Tuy nhiên nó không phải là giải pháp đúng vì nó chỉ đề cập đến '+' chứ không phải các ký tự khác cần được mã hóa. –
Điều này không hiệu quả đối với tôi. Thay vào đó, tôi mã hóa dấu thời gian bằng câu trả lời của Ric Santos TRƯỚC KHI tạo urlString. Theo kinh nghiệm của tôi, tôi chưa từng thấy ai cần mã hóa tên tham số, lược đồ, tên miền hoặc các phần khác của url. Vì vậy, luôn luôn tốt nhất để mã hóa các giá trị tham số riêng biệt. Tuy nhiên, sẽ rất tuyệt khi có một chức năng có thể phá vỡ một url, mã hóa nó một cách chính xác, sau đó đặt nó lại với nhau. Tôi giả định rằng stringByAddingPercentEscapesUsingEncoding đã làm điều này, nhưng dường như nó không thành công cho các trường hợp như + dấu hiệu. – Brainware