前言
前端时间进行报文加密传输改造,碰到了特殊字符和中文乱码问题,后来使用URL编码成功解决(报文传送之前进行URL编码,收到报文之后进行URL解码),记录下,方便以后查看
遇到的问题
- 解码服务端返回报文是,空格解析成了加号
- 引起原因
java中URL编码和iOS中URL编码规范遵循规范不一样(历史原因导致),具体各自遵循什么规范忘记了,也找不到当时是从那看到的了,PS:记住教训,以后看到要及时做好记录 - 解决方案
在解码之前手动把“+”替换为“%20”(暂未找到更好的解决方案)
百度了下,网上也基本都是替换解决的,如:https://www.sojson.com/blog/6.html - 疑问:报文中真的有“+”怎么办?
“+”在进行URL编码时会被处理成“%2B”,所以不用担心报文中真正的“+”被替换成空格,一般情况下空格在URL编码之后会被处理成“%20”
- 引起原因
编码实现
说明:编码实现写在字符串分类(category)中
url编码
#pragma mark - URLEncode(URL编码)
/**
URLEncode(URL编码)
@return URLEncodeString
*/
- (NSString *)ido_URLEncodedString {
return [self ido_URLEncodedStringUsingEncoding:NSUTF8StringEncoding];
}
/**
URLEncode(URL编码)
@param encoding encoding格式
@return URLEncodeString
*/
- (NSString *)ido_URLEncodedStringUsingEncoding:(NSStringEncoding)encoding {
NSString *decodedString = self;
//NSString *encodedString = [decodedString stringByAddingPercentEscapesUsingEncoding:encoding];
NSString *encodedString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)decodedString, NULL, (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ", CFStringConvertNSStringEncodingToEncoding(encoding));
return encodedString;
}
url解码
#pragma mark - URLDecode(URL解码)
/**
URLDecode(URL解码)
@return URLDecodeString
*/
- (NSString *)ido_URLDecodedString {
return [self ido_URLDecodedStringUsingEncoding:NSUTF8StringEncoding];
}
/**
URLDecode(URL解码)
@param encoding encoding格式
@return URLDecodeString
*/
- (NSString *)ido_URLDecodedStringUsingEncoding:(NSStringEncoding)encoding {
NSString *encodedString = self;
// 处理iOS环境下 " " 被转换为 "+" 问题
encodedString = [encodedString stringByReplacingOccurrencesOfString:@"+" withString:@"%20"];
//NSString *decodedString = [encodedString stringByReplacingPercentEscapesUsingEncoding:encoding];
NSString *decodedString = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)encodedString, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(encoding));
return decodedString;
}