2013-12-25 4 views
2

я пытаюсь сделать что URL-кодирование для длинной строки, используя эту функциюUrlEncode в Objective-C

NSData *PostData = [MyString dataUsingEncoding:NSUTF8StringEncoding]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://xxxxxxx.com/save.php"]]; 

    [request setValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:PostData]; 
    [request setHTTPMethod:@"POST"]; 

но я пропустить некоторые данные, когда сохранить его в моей SQL , например, если мы имеем эту строку, содержит специальные символы

("текст @ # & ( |«л;!,. «) и < улыбки лицо

, когда эта строка принимает мой сервер, я пропускаю строку после этого & и после улыбок??!

+0

Что-то не так с использованием 'stringByAddingPercentEscapesUsingEncoding:'? –

+1

@HotLicks Да, это не будет уклоняться от определенных символов (особенно '+' и '&' являются проблематичными). Вы должны использовать 'CFURLCreateStringByAddingPercentEscapes'. – Rob

ответ

8

Вы не показывают нам, как вы создали 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, мы получим наши смайлики в порядке.

Я подозреваю, что проблема сейчас заключается не в том, что смайлики имеют правильный процент, а скорее из-за использования вами по назначению.

+0

Хорошо работать, но такая же проблема, если в моей строке есть улыбка, как исправить это. – Fawaz

+0

Возможно, это зависит от сервера. Технически домены теперь могут быть почти любым символом Юникода. (Россия - это место, где URL-адреса популярны на кириллице, например.), но не все программное обеспечение обрабатывает эту скважину. – uchuugaka

+0

@Fawaz Символы смайликов правильно закодированы (как показано в моем пересмотренном ответе). Вопрос в том, что вы подразумеваете под «той же проблемой, если есть лица улыбки». Используя эту процентную escape-кодировку, вы должны иметь возможность отправлять эти строки и не досрочно их прервать или что-то неприятное. Вопрос в том, что делает ваш сервер с этой строкой. – Rob