百分号编码实际解决的是什么问题
URL本来的定位,是能够在浏览器、服务器、邮件客户端等无数不同系统之间稳定传递的一段紧凑文本,而这些系统在历史上很多只能安全处理有限的ASCII字符集。百分号编码把超出这个安全范围的字符,以及被当作数据使用的保留字符,统一转换成基于该字符UTF-8字节表示的标准%XX格式,从而保证不管是哪种系统在处理这段字符串,都不会产生歧义,也能安全传递。
真正会导致编码URL出问题的错误
重复编码——对一个已经做过百分号编码的字符串再编码一次——是实际开发中很常见的一类问题,它会把已经存在的%符号变成%25,以一种从外观上不容易察觉的方式把URL悄悄破坏掉。另一个常见的混淆,是把+和%20当成任何场合都可以互换的东西:+表示"空格"只在表单编码的查询数据里成立,如果在URL路径等其他位置使用+,很可能会被当成字面上的加号,而不是空格。
常见问题
为什么一个中文、日文或韩文字符编码后,会变成一长串百分号?
因为这些字符不在基本的ASCII范围内,在UTF-8中通常需要用多个字节表示(很多中日韩文字常见的是3个字节),而每一个字节都会被单独编码成一组%XX,所以一小段非拉丁文字,编码后的字符串长度会明显变长。
表示空格的%20和+,实际区别是什么?
%20是通用的空格百分号编码,在URL的任何地方都有效。而用+表示空格,是仅适用于application/x-www-form-urlencoded表单数据的一种更早期、更局限的惯例,在这个场景之外使用+,很可能会被解读成字面上的加号,而不是空格。