如何使用特殊字符对字符串进行编码,该字符串将被发布到URL?Objective-C的

Con*_*son 3 objective-c nsxmlparser ios

目前我有一个字符串,我想POST到URL.

除非遇到像"&"和"?"这样的特殊字符,否则它的效果非常好.它不会发布之后发布的任何数据.例如,如果我有一个字符串"我是什么东西?",它只会POST"我是某种东西".至于"?",它会在发布后转换为"2".

reason = 'What see see! Are you sure'2''
Run Code Online (Sandbox Code Playgroud)

我很确定它必须与编码有关,因为我可以看到"我是什么东西?" 因为它就在我设置编码之前:

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

我也试过下面的编码没有成功:

NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
NSData *postData = [post dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSData *postData = [post dataUsingEncoding:NSISOLatin1StringEncoding];
Run Code Online (Sandbox Code Playgroud)

以下是我从postData开始的代码:

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];
    //NSLog(@"PostData: %@", postData);
    NSString *check = [[NSString alloc] initWithData:postData encoding:NSASCIIStringEncoding];
    NSLog(@"check string = %@", check);
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:strURLQueryString]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];
    NSURLResponse *response;
    NSError *err=nil;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSString *strResponse = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
     NSLog(@"Response: %@", strResponse);
     if(err!=nil) {
     NSLog(@"Error: %@", [err description]);
     }
Run Code Online (Sandbox Code Playgroud)

请协助.感谢您的帮助.

dan*_*anh 5

那里可能有一个更好的答案,但这个类扩展已经为我工作了一段时间.我通过查看几个帖子拼凑了%escapes ...

//  NSString+URLEncoding.h
@interface NSString (NSString_URLEncoding)

- (NSString *)urlEncodeUsingEncoding:(CFStringEncoding)encoding;
- (NSString *)urlEncode;

@end

//  NSString+URLEncoding.m
@implementation NSString (NSString_URLEncoding)

- (NSString *)urlEncodeUsingEncoding:(CFStringEncoding)encoding {

    return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                     (__bridge CFStringRef)self,
                                                                     NULL,
                                                                     CFSTR("!*'();:@&=+$,/?%#[]"),
                                                                     encoding));
}

- (NSString *)urlEncode {

    return [self urlEncodeUsingEncoding:kCFStringEncodingUTF8];
}
Run Code Online (Sandbox Code Playgroud)

然后在somer其他类中发送一个字符串......

// SomeOtherClass.m

#import "NSString+URLEncoding.h"

NSString *encodedString = [@"This & this? are 'challenging' to !% encode" urlEncode];
Run Code Online (Sandbox Code Playgroud)