iOS URLencoding
2016-02-25 09:26
267 查看
在ios开发中,涉及网络部分的时候,需要写一些url,url中不能避免的会出现中文,出现中文的时候,如果不做处理,就会出现错误。解决这个的问题办法就是对url进行URLencoding,原因和解决方法如下。
原因:
之所以有URLencoding这种编码方式,是因为全世界都是用URL访问网站的页面,然而各个国家不同,语言也不同,网站不能兼容所有的语言,所以给大家统一了URL访问的编码。一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址”http://www.abc.com”,但是没有希腊字母的网址”http://www. aβγ.com”。这是因为网络标准RFC1738做了硬性规定:
Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL。 只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于
URL。
这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。
实验:
当汉字处在url中的路径中———UTF-8
http://zh.wikipedia.org/wiki/春节
查看HTTP请求的头信息,会发现IE实际查询的网址是“http://zh.wikipedia.org/wiki/春节 ”。 也就是说,IE自动将“春节”编码成了“春节”。
我们知道,“春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A 82”,因此,“春节”就是按照顺序,在每个字节前加上%而得到的。(具体的转码方法,请参考我写的《字符编码笔记》 。)
在Firefox中测试,也得到了同样的结果。
所以,结论1就是,网址路径的编码,用的是utf-8编码。
2. 查询字符串包含汉字
http://www.baidu.com/s?wd=春节
切换到十六进制方式,才能清楚地看到,“春节”被转成了“B4 BA BD DA”。
我们知道,“春”和“节”的GB2312编码(我的操作系统“Windows XP”中文版的默认编码)分别是“B4 BA”和“BD DA”。因此,IE实际上就是将查询字符串,以GB2312编码的格式发送出去。
Firefox的处理方法,略有不同。它发送的HTTP Head是“wd=����”。也就是说,同样采用GB2312编码,但是在每个字节前加上了%。
所以结论2就是,查询字符串的编码,用的是操作系统的默认编码。
3. Get方法生成的URL包含汉字
前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。
这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。
解决办法:
NSString
* body = [[NSString
alloc]
initWithFormat:@"access_token=%@&comment=%@&id=%@",_access_token,_commentText.text,_Tid];
其中comment是可能包含中文的。
NSString
*encodingString = (NSString
*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef) body, (CFStringRef)
@"&%",
nil,kCFStringEncodingUTF8));
原因:
之所以有URLencoding这种编码方式,是因为全世界都是用URL访问网站的页面,然而各个国家不同,语言也不同,网站不能兼容所有的语言,所以给大家统一了URL访问的编码。一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址”http://www.abc.com”,但是没有希腊字母的网址”http://www. aβγ.com”。这是因为网络标准RFC1738做了硬性规定:
Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL。 只有字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于
URL。
这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。
实验:
当汉字处在url中的路径中———UTF-8
http://zh.wikipedia.org/wiki/春节
查看HTTP请求的头信息,会发现IE实际查询的网址是“http://zh.wikipedia.org/wiki/春节 ”。 也就是说,IE自动将“春节”编码成了“春节”。
我们知道,“春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A 82”,因此,“春节”就是按照顺序,在每个字节前加上%而得到的。(具体的转码方法,请参考我写的《字符编码笔记》 。)
在Firefox中测试,也得到了同样的结果。
所以,结论1就是,网址路径的编码,用的是utf-8编码。
2. 查询字符串包含汉字
http://www.baidu.com/s?wd=春节
切换到十六进制方式,才能清楚地看到,“春节”被转成了“B4 BA BD DA”。
我们知道,“春”和“节”的GB2312编码(我的操作系统“Windows XP”中文版的默认编码)分别是“B4 BA”和“BD DA”。因此,IE实际上就是将查询字符串,以GB2312编码的格式发送出去。
Firefox的处理方法,略有不同。它发送的HTTP Head是“wd=����”。也就是说,同样采用GB2312编码,但是在每个字节前加上了%。
所以结论2就是,查询字符串的编码,用的是操作系统的默认编码。
3. Get方法生成的URL包含汉字
前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。
这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。
解决办法:
NSString
* body = [[NSString
alloc]
initWithFormat:@"access_token=%@&comment=%@&id=%@",_access_token,_commentText.text,_Tid];
其中comment是可能包含中文的。
NSString
*encodingString = (NSString
*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef) body, (CFStringRef)
@"&%",
nil,kCFStringEncodingUTF8));
相关文章推荐
- 多线程编程指南之线程管理(iOS,Mac os )
- ios 枚举
- 正则表达式简单语法规则和IOS的使用
- iOS消息机制
- iOS问题: 此证书的签发者无效
- kidd风的IOS日志之利用dispatch_once创建单例
- 原 iOS中的内存管理(下)
- iOS中的内存管理(上)
- iOS开发之AFN的基本使用
- iOS沙盒机制
- iOS Developer Libray (中文版)-- Defining Classes 定义类
- iOS获取设备信息与应用信息
- iOS编程中,中文字符转为拼音
- iOS 宏
- 四个月期间 我在蜂窝教育iOS培训
- 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- ios 下拉刷新
- ios 异步加载图片结合tableView SDWebImage
- iOS开发笔记
- iOS新的视频开发框架AVPlayerViewContoller与画中画技术