Чтобы правильно URL-кодировать ваши параметры, вам нужно преобразовать каждое имя и значение в UTF-8, затем URL-кодировать каждое имя и значение отдельно, затем объединить имена со значениями, используя '=', и пары имя-значение, используя '&' .
Как правило, мне проще поместить все параметры в NSDictionary, а затем построить строку запроса из словаря. Вот категория, которую я использую для этого:
// file NSDictionary+UrlEncoding.h
#import <Cocoa/Cocoa.h>
@interface NSDictionary (UrlEncoding)
-(NSString*) urlEncodedString;
@end
// file NSDictionary+UrlEncoding.m
#import "NSDictionary+UrlEncoding.h"
// private helper function to convert any object to its string representation
static NSString *toString(id object) {
return [NSString stringWithFormat: @"%@", object];
}
// private helper function to convert string to UTF-8 and URL encode it
static NSString *urlEncode(id object) {
NSString *string = toString(object);
return [string stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}
@implementation NSDictionary (UrlEncoding)
-(NSString*) urlEncodedString {
NSMutableArray *parts = [NSMutableArray array];
for (id key in self) {
id value = [self objectForKey: key];
NSString *part = [NSString stringWithFormat: @"%@=%@",
urlEncode(key), urlEncode(value)];
[parts addObject: part];
}
return [parts componentsJoinedByString: @"&"];
}
@end
Метод создает массив пар имя-значение, называемый parts
, с помощью URL-адреса, кодирующего каждый ключ и значение, а затем соединяя их вместе с '='. Затем части в массиве parts
объединяются с помощью символов '&'.
Итак, для вашего примера:
#import "NSDictionary+UrlEncoding.h"
// ...
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
[parameters setValue: @"t" forKey: @"client"];
[parameters setValue: @"auto" forKey: @"sl"];
[parameters setValue: destinationLanguage forKey: @"tl"];
[parameters setValue: text forKey: @"text"];
NSString *urlString = [@"/translate_a/t?" stringByAppendingString: [parameters urlEncodedString]];