如何使用NSMutableURLRequest在iOS中正确编码UTF-8?

时间:2015-01-30 05:12:29

标签: ios objective-c encoding utf-8 nsmutableurlrequest

我正在尝试向登录网络服务发送信息,但某些字符给我带来了麻烦。

例如,如果密码类似于h+4hfP,则网络服务会拒绝该密码,因为加号(“+”)未正确编码为%2B

Web服务使用UTF-8编码,因此我一直使用此NSString方法构建NSData对象,- (NSData *)dataUsingEncoding:(NSStringEncoding)encoding;选择NSUTF8StringEncoding作为编码。

但这似乎还不够。

问题还可能在于我如何构建NSMutableURLRequest

NSData *postData = [@"h+4hfP" dataUsingEncoding:NSUTF8StringEncoding];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:contentLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];

如何确保编码正确完成?

3 个答案:

答案 0 :(得分:2)

使用

 [theRequest setValue:@"application/json; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];

答案 1 :(得分:0)

您可以在将字符串表示为NSData之前对该字符串进行百分比编码:

NSString *password = [@"h+4hfP" stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet alphanumericCharacterSet]];
NSData *postData = [password dataUsingEncoding:NSUTF8StringEncoding];
...

答案 2 :(得分:0)

这可以是一个解决方案: 我正面临这个问题。几个小时后搜索,我发现了这个: http://madebymany.com/blog/url-encoding-an-nsstring-on-ios

解决方案: 第1名:您必须创建包含内容的方法或类:

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding withString:(NSString *) str{
return (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                           (CFStringRef)str,
                                                           NULL,
                                                           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
                                                           CFStringConvertNSStringEncodingToEncoding(encoding)));

}

第二名:使用:

NSString *stringToSend = [self urlEncodeUsingEncoding:NSUTF8StringEncoding withString:stringToBeVerifyed];

然后

NSData *postData = [stringToSend dataUsingEncoding:NSUTF8StringEncoding];
[...]