您没有向我们展示您是如何创建 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)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
}
从技术上讲,根据the W3C specs 的application/x-www-form-urlencoded,您应该用+ 字符替换空格,因此:
- (NSString *)percentEscapeString:(NSString *)string
{
NSString *result = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)string,
(CFStringRef)@" ",
(CFStringRef)@":/?@!$&'()*+,;=",
kCFStringEncodingUTF8));
return [result stringByReplacingOccurrencesOfString:@" " withString:@"+"];
}
就我个人而言,我将这些方法放在NSString 类别中,而不是在当前类中,但希望这能说明这个想法。
无论如何,不要不要尝试使用stringByAddingPercentEscapesUsingEncoding,因为这无法为您提供所需的控制。你确实需要使用CFURLCreateStringByAddingPercentEscapes,如上所示。
您询问了表情符号。上述百分比转义适用于表情符号。例如,考虑:
NSString *string1 = @"Text !@# & ( | '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] 文本!@# & (|'l;,.???
2013-12-25 18:20:16.397 PercentEncodeTest[67199:70b] 文本%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] 文本!@# & (|'l;,.???
如您所见,string2 完全被转义,应该被正确传输。当我们转换回NSUTF8StringEncoding 时,我们的表情符号恢复正常。
我怀疑现在的问题不在于表情符号是否被正确地转义了,而在于您在目的地对它们的使用。