【问题标题】:How to encode a string with special characters that will be POSTed to a URL? Objective-C如何使用将发布到 URL 的特殊字符对字符串进行编码? Objective-C
【发布时间】:2013-08-15 03:46:06
【问题描述】:

目前我有一个字符串要发布到 URL。

除了遇到“&”和“?”等特殊字符外,它工作得很好。它不会发布之后的任何数据。例如,如果我有一个字符串“I am something & something?”,它只会发布“I am something”。至于“?”,发布后会转换为“2”。

reason = 'What see see! Are you sure'2''

我很确定它一定与编码有关,因为我可以看到“我是某物和某物?”就像在我设置编码之前一样:

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding];

我也尝试了以下编码,但没有成功:

NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
NSData *postData = [post dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSData *postData = [post dataUsingEncoding:NSISOLatin1StringEncoding];

以下是我从 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]);
     }

请帮忙。 感谢您的帮助。

【问题讨论】:

  • 所以当您使用NSData *postData = [post dataUsingEncoding:SOME_ENCODING]; 时,您使用了NSString *check = [[NSString alloc] initWithData:postData encoding:SOME_ENCODING]; NSLog(@"check string = %@", check);,而您当时错过了这些字符?
  • 我从来没有这样做过,但既然你提到了,我试了一下,我可以看到确切的字符串。我将发布后续代码。

标签: ios objective-c nsxmlparser


【解决方案1】:

在某个地方可能有更好的答案,但是这个类扩展已经为我工作了一段时间。通过查看一些帖子,我拼凑了 % 逃逸......

//  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];
}

然后在 somer other class 中发送一个字符串...

// SomeOtherClass.m

#import "NSString+URLEncoding.h"

NSString *encodedString = [@"This & this? are 'challenging' to !% encode" urlEncode];

【讨论】:

  • 这就是我所做的。 1. 我创建了另一个名为“NSString+URLEncoding”的类。 2.我在.h中声明了你的方法,并在.m中实现了这些方法。 3.然后我调用了方法,NSString *encodedReason = [reason urlEncode]; 4. 参考 3,我收到此错误,NSMutableString 没有可见接口声明选择器“UrlEncode”。我错过了什么吗?
  • 您是否导入了新创建的类NSString+URLEncoding,您将在其中调用urlEncode 方法?
  • @LucasEduardo 是的,我有。
  • 我尝试编辑以更明确地说明如何进行类扩展。这段代码绝对可以编译并允许我发布百分比编码的字符串。
  • 我可以查看您的 .h、.m 文件吗?也许我监督一些事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多