[Basic] URLEncode

本文深入解析URL编码(百分号编码)机制,阐述其在统一资源定位符(URL)及统一资源标识符(URI)中的应用,包括保留字符与未保留字符的定义,以及如何根据RFC3986规范进行编码,特别关注中文、日文等非英文字符的编码过程。

URLEncode 介绍

百分号编码(英语:Percent-encoding), 也称作URL编码(英语:URL encoding), 是特定上下文的统一资源定位符 (URL)的编码机制. 实际上也适用于统一资源标志符(URI)的编码。也用于为"application/x-www-form-urlencoded" MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。

URI所允许的字符分作保留与未保留。保留字符是那些具有特殊含义的字符. 例如, 斜线字符用于URL (或者更一般的, URI)不同部分的分界符. 未保留字符没有这些特殊含义. 百分号编码把保留字符表示为特殊字符序列。上述情形随URI与URI的不同版本规格会有轻微的变化。

RFC 3986 section 2.2 保留字符 (2005年1月)
!	*	'	(	)	;	:	@	&	=	+	$	,	/	?	#	[	]
RFC 3986 section 2.3 未保留字符 (2005年1月)
A	B	C	D	E	F	G	H	I	J	K	L	M	N	O	P	Q	R	S	T	U	V	W	X	Y	Z
a	b	c	d	e	f	g	h	i	j	k	l	m	n	o	p	q	r	s	t	u	v	w	x	y	z
0	1	2	3	4	5	6	7	8	9	-	_	.	~	
URI中的其它字符必须用百分号编码。
复制代码

例如: https://host/path/queryString

path: 对 (非保留字 非未保留字) 例如中文,日文等 进行 URLEncode

对于path部分,我们要对 像中文这种字符Encode 不用对 保留字符进行Encode
例子: https://www.zhihu.com/question/1957?/%E4%BD%A0%E5%A5%BD705
复制代码

queryString(key 和 value): 对 保留字 和 (非保留字 非未保留字)进行 URLEncode

对于query部分,我们要对 保留字进行Encode 还要对 像中文这种字符Encode
例子: https://www.zhihu.com/question?password=%26abc%E4%BD%A0%E5%A5%BD705
复制代码

URLEncode 背景

###这里引述了阮一峰老师的文章###

URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"www.abc.com",但是没有希腊字母的网址"http://www.aβγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定:

"...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中有汉字,就必须编码后使用。

URLEncode 规则

注意: URLEncode是如何给一个字符串进行编码的呢? 比如我们使用的 UTF-8 百分比编码的方式abc&+你好日本文と进行编码,那么流程是什么呢?

[待Encode字符串] --> [UTF8编码] --> [将未保留字符还原成原字符] --> [进行百分比编码(将`\x`替换成`%`全部大写)] --> [百分比编码完成]
复制代码
  1. 首先对 abc&+你好日本文と 进行UTF-8编码得到(转码工具) \x61\x62\x63\x26\x2b\xe4\xbd\xa0\xe5\xa5\xbd\x08\xe6\x97\xa5\xe6\x9c\xac\xe6\x96\x87\xe3\x81\xa8

  2. 其次,识别出不需要编码的字符,比如未保留字符。 程序识别到\x61\x62\x63abc,因为abc是字母 是未保留字符,根据URLEncode RFC规则 是不需要编码的。

  3. 然后对URL中保留字符 和 非未保留字符(例如 中文,日文等等),进行百分比编码,哪些需要编码,哪些不要编码,是根据RFC协议拟定的。

    • 对保留字符进行百分比Encode abc\x26\x2b\xe4\xbd\xa0\xe5\xa5\xbd\x08\xe6\x97\xa5\xe6\x9c\xac\xe6\x96\x87\xe3\x81\xa8接着程序识别到\x26\x2b&+是保留字符需要编码,将\x替换成%得到百分比Encode为%26%2b,现在我们的字符串变成这样abc%26%2b\xe4\xbd\xa0\xe5\xa5\xbd\x08\xe6\x97\xa5\xe6\x9c\xac\xe6\x96\x87\xe3\x81\xa8

    • 对非未保留字符(例如 中文,日文等等) 进行百分比Encode 你好日本文と的utf8编码是\xe4\xbd\xa0\xe5\xa5\xbd\x08\xe6\x97\xa5\xe6\x9c\xac\xe6\x96\x87\xe3\x81\xa8根据URLEncode RFC规则 非字符特殊字符集是需要编码的,将\x替换成%进行百分比编码后%e4%bd%a0%e5%a5%bd%08%e6%97%a5%e6%9c%ac%e6%96%87%e3%81%a8

  4. 最终结果:abc%26%2b%e4%bd%a0%e5%a5%bd%08%e6%97%a5%e6%9c%ac%e6%96%87%e3%81%a8

  5. 验证

    例如我在Google下面搜索 abc&+你好日本文と 得到如下URL

    www.google.com/search?safe…abc%26%2B%E4%BD%A0%E5%A5%BD%08%E6%97%A5%E6%9C%AC%E6%96%87%E3%81%A8&oq=abc%26%2B%E4%BD%A0%E5%A5%BD%08%E6%97%A5%E6%9C%AC%E6%96%87%E3%81%A8&gs_l=psy-ab.3..35i39k1l6.2170.2170.0.2308.4.2.0.0.0.0.0.0..1.0....0...1c.2.64.psy-ab..3.1.240.6...240.L7DaN_M8pP8

    Google搜索引擎截取下的:  
    abc%26%2B%E4%BD%A0%E5%A5%BD%08%E6%97%A5%E6%9C%AC%E6%96%87%E3%81%A8
    
    我们自己按照规则得到的:
    abc%26%2b%e4%bd%a0%e5%a5%bd%08%e6%97%a5%e6%9c%ac%e6%96%87%e3%81%a8
    复制代码

在线转码工具:
UTF8 Convert to Unicode Tools: www.branah.com/unicode-con…
UTF8 Online Encode: www.browserling.com/tools/utf8-…

Reference:
RFC3986协议:www.ietf.org/rfc/rfc3986…
WiKi: en.wikipedia.org/wiki/Percen…
ruanyifeng: www.ruanyifeng.com/blog/2010/0…

转载于:https://juejin.im/post/5be46c2d6fb9a049a7114f33

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值