URL的格式

对以下url进行分析:

//http://abc:999/dr/dr2;pa?field-1=v1&f2=value-2#an

- (IBAction)analysisClick:(id)sender {

    NSURL *url=[NSURL URLWithString:txtUrl.text];

    NSLog(@"Scheme: %@", [url scheme]); //Scheme: http

    NSLog(@"Host: %@", [url host]); //Host: abc

    NSLog(@"端口: %@", [url port]); //端口: 999

    NSLog(@"路径: %@", [url path]); //路径: /dr/dr2

    NSLog(@"相对路径: %@", [url relativePath]); //相对路径: /dr/dr2

    NSLog(@"打出一个路径的数组: %@", [url pathComponents]);//"/",dr,dr2 这个可以循环进行判断它是否等于shenm

    NSLog(@"参数: %@", [url parameterString]); //参数: pa

    NSLog(@"查询的值: %@", [url query]); //查询的值: field-1=v1&f2=value-2

    NSLog(@"Fragment: %@", [url fragment]); //Fragment: an

}


url,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。

协议标准如下:
scheme://domain:port/path?query_string#fragment_id
对协议的各部分展开说明一下。

=== scheme
传输协议, 我们经常看到的传输协议有三种,分别是http,https,ftp
=== domain
域名或ip
===port
服务器端口
===path
服务器路径
===query_string
查询参数,以'?'为起点,每个参数通过&分隔开,再以=分割参数key-value,
对query_string进行utf8编码.
根据rfc 1738文档规定, url必须由英文符号,数字和某些标点符号组成,不能出现其他文字,
因此所有包含中文字符的url事实上都是非法的。我们为了实现在url中传递中文字符的目的。
会提前对url里的中文进行编码。
但由于rfc1738没有规定具体的中文编码类型,所以这一块处于未定义状态。比较混乱。由web服务商和浏览器独立定义,
比如说百度会将中文转化成gbk编码,google会将中文转化成utf8编码。
再比如说 firefox会将中文转化成gbk编码。而ie不对非ascii码的url进行编码,他会直接按照操作系统默认编码进行发送。
所以这里要考虑两个方面,第一方面是浏览器的编码转化,第二方面是网站平台的编码转换。
业内通行的做法,是对中文进行一次utf8编码。

js和url编码相关的函数有以下几个
== escape
对String对象编码以便使他们能在所有计算机上可读
函数签名:escape(charString)
必选项charstring参数是要编码的任意string对象
escape方法返回一个包含了charstring内容的字符串值(Unicode格式). 所有空格,标点,重音符号以及其他非ascii字符都用%xx 编码代替,其中xx等于表示该字符的ascii值。例如,空格返回的是"%20", 字符值大于255的以%uxxxx格式存储,其中xxxx表示该字符的unicode值
注意: escape方法不能用来对统一资源标识符(URI)进行编码。对其编码应使用encodeURI和encodeURIComponent方法。
对应的解码函数为unescape函数
== encodeURI
encodeURI函数可将字符串作为URI进行编码
函数签名: encodeURI(URIString)
URIString是一个含有URI或其他要编码的文本的字符串.返回一个URIString的副本,其中某些字符将被16进制的转义序列进行替换。 该方法不会对ascii字母和数字进行编码。
该方法目的是对URI进行完整编码.因此对以下在URI中具有特殊意义的ascii标点符号,encodeURI函数是不会进行转义的. ;/?:@&=+$,#
也不会对这些ascii标点符号进行编码: -_.!~*'()
对应的解码函数为decodeURI
== encodeURICommponent
该函数可把字符串作为URI组件进行编码。
函数签名encodeURIComponent(URIstring)
该方法不会对ASCII字母和数字进行编码,也不会对这些ascii标点符号进行编码: -_.!~*'()
其他字符(比如 :;/?@&=+$这些用于分割URI组件对标点符号),都由一个或者多个16进制的转义序列替换
和encodeURI的不同在于, 前者假定参数是URI的一部分(比如协议,主机名,路径或者查询字符串)。 因此encodeURIComponent对象将转义用于分割URI各个部分的标点符号.
对应的解码函数为decodeURIComponent
== 总结
escape除了acsii字母,数字和特定的符号外,对传进来的字符串全部进行转义编码,如果想对url编码,最好不要使用此方法。 而encodeURI用于编码整个URI,应为uRI中的合法字符都不会被编码转换。 encodeURIComponent方法编码URI的某一部分。它可以对中文进行转义而不会影响到整个URI.
escape不对 @*/+编码
encodeURI 不对 ~!@#$&*()=:/,;?+编码
encodeURIComponent不对~!*()'编码
escape是window对象的方法
encodeURIComponent和encodeURI是js内置函数
=== freagment_id 锚参数

锚参数不是服务器资源的一部分,理论上不会发送给服务器。js可以通过window.location.hash获取锚参数。

以上摘自:点击打开链接


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值