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

如何使用NSMutableURLRequest在iOS中正确编码UTF-8?,ios,objective-c,encoding,utf-8,nsmutableurlrequest,Ios,Objective C,Encoding,Utf 8,Nsmutableurlrequest,我试图将信息发送到登录web服务,但某些字符给我带来了麻烦 例如,如果密码类似于h+4hfP,则web服务会拒绝它,因为加号(“+”)未正确编码为%2B web服务使用UTF-8编码,因此我一直在使用此NSString方法构建NSData对象,-(NSData*)dataUsingEncoding:(NSStringEncoding)编码选择NSUTF8StringEncoding作为编码 但这似乎还不够 问题还可能在于我如何构建NSMutableURLRequest: NSData *post

我试图将信息发送到登录web服务,但某些字符给我带来了麻烦

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

web服务使用UTF-8编码,因此我一直在使用此NSString方法构建NSData对象,
-(NSData*)dataUsingEncoding:(NSStringEncoding)编码选择
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];

如何确保正确编码?

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

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

这可以是一个解决方案: 我正面临着这个问题。经过几个小时的搜索,我发现:

解决方案: 第一:必须创建包含以下内容的方法或类:

-(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];
然后


我能够使用类别[found here][1]来解决这个问题。[1] 例如我遇到了类似的问题。对我来说最重要的一点是内容类型字段中的“charset=UTF-8”,这在OP中丢失了。
NSString *stringToSend = [self urlEncodeUsingEncoding:NSUTF8StringEncoding withString:stringToBeVerifyed];
NSData *postData = [stringToSend dataUsingEncoding:NSUTF8StringEncoding];
[...]