项目中遇到的小问题,让我去详细看了下URL特殊字符的编码和转义, 问题是这样的,我一个方法中通过第三方api接口,获取代币token的当前价格,例如获取eth价格直接浏览器输入是http://xxxxxxx:8094?tokenName=ethereum, 在方法中是通过HttpUrlConnection传入url来获取的,但是tokenName有可能带有空格,比如Binance Coin,这个时候就会报错了,原因是空格是特殊字符,需要转义字符代替,空格的转义字符是%20。
URL是可移植资源,各种不同网络协议解析URL资源需要做到统一识别,RFC标准规定,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号,我们知道通用的字节编码是ASCii,为了使所有字符都能被覆盖,就要用ASCii涵盖的转义字符来表示特殊字符,打一个外行比喻,比如一个传输系统不支持汉子,只支持英文,那我要传输‘爱’这个字,就只能用love来代替,love就是‘爱’的转义字符,所以对于空格来说,ASCii表中对应的16进制是20,URL编码规范是%+16进制,也就是%20,它就空格的转义字符,就代表了空格。其他特殊字符也是如此。
所以以后对于编码中涉及到的url处理,一定要考虑是否会出现特殊字符,如果有这种情形,考虑转义。
参考http权威指南P38(各种令人头疼的字符)
参考阮一峰文章:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html