iOS base64和URLEncode解决数据传输问题
2017-11-10 本文已影响44人
十一遥
新项目里,有些地方传输中文, GET,参数采用base64编码, 上传的时候,发现安卓可以成功,iOS不行
iOS发送的请求, base64后含有 "+" 和 "/" 在服务器端都会显示成" " (也就是空格). 因而无法解码.
原文: 1977我不记得了
base64编码:MTk3N+aIkeS4jeiusOW+l+S6hg==
iOS抓包此参数为:MTk3N+aIkeS4jeiusOW+l+S6hg==
安卓本地log为:MTk3N+aIkeS4jeiusOW+l+S6hg==
安卓抓包此参数为:MTk3N%2BaIkeS4jeiusOW%2Bl%2BS6hg%3D%3D%0A
我们再把安卓的数据分成两部分:(MTk3N%2BaIkeS4jeiusOW%2Bl%2BS6hg%3D%3D)+(%0A)
后面的%0A是换行,没有实际意义,那么答案就跃然纸上 安卓发网络请求的时候,系统自动把base64的编码,进行了urlecode处理, 而ios的网络请求,并未做此处理.
iOS处理方法: (文本) ->(base64编码)->(urlencode编码)->搞定
话不多说,直接上代码:
base64编码
//base64encode
+ (NSString *)base64StringFromText:(NSString *)text{
NSData *encodeData = [text dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [encodeData base64EncodedStringWithOptions:0];
return base64String;
}
//base64encode then urlencode (采用这个方法,一步到位)
+(NSString *)base64AndUrlencodeStringFromText: (NSString *)text{
NSData *encodeData = [text dataUsingEncoding:NSUTF8StringEncoding];
NSString *base64String = [encodeData base64EncodedStringWithOptions:0];
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)base64String,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
//base64decode
+ (NSString *)textFromBase64String:(NSString *)text{
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:text options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
return decodedString;
}
urlencode编码
//urlencode
+(NSString*)encodeString:(NSString*)unencodedString{
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
//urldecode
+(NSString *)decodeString:(NSString*)encodedString{
NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL,
(__bridge CFStringRef)encodedString,
CFSTR(""),
CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
return decodedString;
}