一次经历

服务端按照URLEncoder.encode(str)编码,安卓客户端根据Uri.decode(str)解码,除+之外,所有的字符都解析正确,唯独这个+没有解码为空格,这问题也好解决,安卓客户端使用URLDecoder.decode(str)就可以了,客户端代码改动,需要上线才能解决问题,最好还是服务端解决空格转+问题。其实也很简单。直接将encode之后的结果再做一次统一转换,将+统一改为%20。这样,安卓客户端也不用修改Uri.decode()为URLDecoder.decode()了,而且这类问题就从根本上解决了。

PS

通过上述做法不需要担心hard code对url的影响,因为本质其实就是因为%20,+对应空格,你在编码的时候把 + 替换成了%20,但是url不会有别的地方使用+号,+号的编码是%2B,所以完全可以encode以后对+号进行替换

拓展

URL中不能显示地包含空格这已经是一个共识,而空格以何种形式存在,在不同的标准中又不完全一致,以致于不同的语言也有了不同的实现。

rfc2396中明确表示空格应该被编码为%20。

而W3C的标准中却又说空格可以被替换为+或者%20。