Вы не показывают нам, как вы создали MyData
переменная или какой тип это, но я предполагаю, что это NSString
, что вы, возможно, построили что-то вроде следующего:
NSString *myString = [NSString stringWithFormat:@"%@=%@", parameterKey, parameterValue];
NSData *postData = [myString dataUsingEncoding:NSUTF8StringEncoding];
Что вам нужно сделать это «процентный побег» любых символов, которые определены как зарезервированные за RFC 3986. Таким образом, вы бы заменить выше:
NSString *myString = [NSString stringWithFormat:@"%@=%@", parameterKey, [self percentEScapeString:parameterValue]];
NSData *postData = [myString dataUsingEncoding:NSUTF8StringEncoding];
где
- (NSString *)percentEscapeString:(NSString *)string
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
NULL,
(CFStringRef)@":/[email protected]!$&'()*+,;=",
kCFStringEncodingUTF8));
}
Технически, в the W3C specs для application/x-www-form-urlencoded
, вы должны заменить пробелы с +
символов, таким образом:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/[email protected]!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
Лично , Я помещал эти методы в категорию NSString
, а не в текущий класс, но, надеюсь, это иллюстрирует идеал а.
Независимо от того, у нет, у вас возникнет соблазн использовать stringByAddingPercentEscapesUsingEncoding
, потому что это не дает вам контроля. Вам действительно нужно использовать CFURLCreateStringByAddingPercentEscapes
, как показано выше.
Вы спрашивали о смайликах. Вышеуказанный процент побегов отлично работает с смайликами. Например, рассмотрим:
NSString *string1 = @"Text [email protected]# & (| 'l;,. ";
NSString *string2 = [self percentEscapeString:string1];
NSString *string3 = [string2 stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", string1);
NSLog(@"%@", string2);
NSLog(@"%@", string3);
2013-12-25 18:20:16.391 PercentEncodeTest[67199:70b] Text [email protected]# & (| 'l;,.
2013-12-25 18:20:16.397 PercentEncodeTest[67199:70b] Text%20%21%40%23%20%26%20%28%20%7C%20%27l%3B%2C.%20%F0%9F%98%92%F0%9F%98%9A%F0%9F%98%9C
2013-12-25 18:20:16.401 PercentEncodeTest[67199:70b] Text [email protected]# & (| 'l;,.
Как вы можете видеть, string2
полностью процентов убежали и должны быть правильно переданы. И когда мы вернемся обратно к NSUTF8StringEncoding
, мы получим наши смайлики в порядке.
Я подозреваю, что проблема сейчас заключается не в том, что смайлики имеют правильный процент, а скорее из-за использования вами по назначению.
Что-то не так с использованием 'stringByAddingPercentEscapesUsingEncoding:'? –
@HotLicks Да, это не будет уклоняться от определенных символов (особенно '+' и '&' являются проблематичными). Вы должны использовать 'CFURLCreateStringByAddingPercentEscapes'. – Rob