Unicode和UTF8、ASCII码的转换:https://blog.csdn.net/zhusongziye/article/details/84261211
在iOS程序中,访问一些HTTP/HTTPS的资源服务时,如果url中存在中文或者特殊字符时,会导致无法正常的访问到资源或服务,想要解决这个问题,需要对url进行编码。网络标准RFC 1738规定url中只能包含英文字母和阿拉伯数字,以及一些特殊字符:
"只有字母和数字[0-9a-zA-Z]、和特殊符号"$-_.+!*'(),"[不包括双引号]、及某些保留字,才可以不经过编码直接用于URL。"
此时如果url中包含如汉字或者其他特殊字符则需要对它进行编码,编码的意义在于,假如url的参数中的中文或特殊字符在发送到服务端时,服务端无法解析它的真正意义,会导致服务端不能理解客户端的请求。
如:
url中的保留字?
表示后面连接的是一些请求参数,而参数中如果也包含?
,服务端就不知道从哪个?
之后是参数;
url中的保留字&
用来连接并列的参数项,参数中包含&
时,服务端依然无法判断。
ASCII 的控制字符:
这些字符都是不可打印的,自然需要进行转化。
一些非ASCII字符:
这些字符自然是非法的字符范围。转化也是理所当然的了。
一些保留字符:
很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?
一些不安全的字符了:
例如:空格。为了防止引起歧义,需要被转化为“+”。
------------url编码------
NSString *originalUrl = @"https://www.xingshulin.com我是中文?p1=abc&p2=我是参数2";
NSCharacterSet *encodeUrlSet = [NSCharacterSet URLQueryAllowedCharacterSet];
NSString *encodeUrl = [originalUrl stringByAddingPercentEncodingWithAllowedCharacters:encodeUrlSet];
NSLog(@"%@", encodeUrl);
stringByAddingPercentEncodingWithAllowedCharacters
接收NSCharacterSet
对象,几种常用的NSCharacterSet
:
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
----------url编码和解码---------
******编码
- (NSString *)URLEncodedString
{
// CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
// CharactersToLeaveUnescaped = @"[].";
NSString *unencodedString = self;
NSString *encodedString = (NSString *)
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)unencodedString,
NULL,
(CFStringRef)@"!*'();:@&=+$,/?%#[]",
kCFStringEncodingUTF8));
return encodedString;
}
**********URL解码:
- (NSString *)URLDecodedString
{
//self就是指的字符串,这里的编码和解码可以放在字符串分类中
NSString *result = [(NSString *)self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
return [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}
---------------------
******编码相关解释:https://blog.csdn.net/shabijiayong/article/details/79094438
1. ASCII码:美国规定的,128字符的编码。
2.Unicode:有符号的编码,Unicode是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样。
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
3.UTF-8:UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF- 16和UTF-32(基本不用)。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有二条:1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode与UTF-8之间可以转换。
4.简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。
5.url编码:非中文的编码:符号的ascii码转换成16进制,每两位加上%就得到URL编码;https://blog.csdn.net/myicer/article/details/83125460
如果有中文的url编码:国外的网站都是按照UTF-8编码,而“百度”是按照“GB2312”进行编码的。比如搜索“中国”,URL是“http://www.baidu.com/s?wd=%D6%D0%B9%FA&cl=3”;
UTF-8中,一个汉字对应三个字节,GB2312中一个汉字占用两个字节。
不论何种编码,字母数字都不编码,特殊符号编码后占用一个字节。
一个16进制占用半个字节。
6、base64编解码原理
将数据编码成BASE64编码时,以3字节数据为一组,转换为24bit的二进制数,将24bit的二进制数分成四组,每组6bit。对于每一组,得到一个数字:0-63。然后根据这个数字查表即得到结果。
ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。