原文参考:iOS Url特殊符号编码问题
当时传输参数给后台,后台总是解析失败。错误信息:
error = "java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: \"\Uff0c\U529e\"
\n\tat java.net.URLDecoder.decode(URLDecoder.java:173)
\n";
可以看到就是因为,请求参数中含有特殊字符,没有处理,导致服务器那边无法正确解析。现在觉得应该是这个问题,url中或者POST请求参数中,带了&%等这些特殊符号,单单使用encodeBase64
、decodeBase64
不行,还要使用encodeToPercentEscapeString
这个处理一下。encodeBase64
、decodeBase64
对汉字和空格进行编码,但不对特殊符号(&%等)编码。
(1)url中key value键值对,根据&进行分割多个key value,所以如果url像这样
@"http://127.0.0.1/php/login.php?username=chang&123&password=admin",
用户名解析的是username为chang而不是chang&123。使用encodeToPercentEscapeString处理后,不会出现这样问题。
(2)POST请求,请求参数中含有特殊字符,也是同样的原理;
//base64编码 "加密"--- 可以把任意的二进制数据 转化成字符串 方便在网络上传输
- (NSString *)encodeBase64:(NSString *)str{
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
return [data base64EncodedStringWithOptions:0];
}
//base64解码 "解密"
- (NSString *)decodeBase64:(NSString *)base64Str{
NSData *data = [[NSData alloc] initWithBase64EncodedString:base64Str options:0];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
//进行特殊字符的编码 (但是不对汉字和空格进行编码)
- (NSString *)encodeToPercentEscapeString: (NSString *) input
{
NSString *outputStr = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)input,NULL,(CFStringRef)@"!*'();:@&=+ $,/?%#[]",kCFStringEncodingUTF8));
return outputStr;
}