空格URL编码问题解决方法

由于当前空格有两种不同的编码方式,一种是在HTML4中定义的,而另一种是在RFC-3986中定义的。

按照HTML4规范,空格应该被编码成加号”+”,而如果字符本身就是加号”+”,则应该被编码成%2B。
按照RFC-3986中采用统一的编码方式,字符的编码格式为:%HH(H为十六进制字符), 并没有对空格做特殊处理。按照RFC-3986规范,空格被编码成%20,而加号”+”被编码成%2B。

从上面可以看出,空格在两种规范下有不同的编码方式,也因此导致我们在开发时会遇到意想不到的错误。例如用户明明提交的是”你 好”,写入数据库之后却变成了”你+好”,往往这种错误让人摸不着头脑,其实这就是由于空格的编码错误导致的。
其实避免上面错误的方法很简单,就是在开发中我们要统一客户端和服务端的编码方式,而不能两者混用。建议客户端和服务端同时使用RFC-3986编码方式,将请求参数全部编码成%HH格式。当然为了保证正确的编码解码,统一的字符集也不可缺少,最好都使用UTF-8。

Java中常用的URL编码类有两个:一个是JDK自带的java.net.URLEncoder,另一个是Apache的org.apache.commons.codec.net.URLCodec。这两个类遵循的都是HTML4标准,即将空格编码成加号”+”,其实要将HTML4的编码结果转换成RFC-3986编码,方法很简单:replaceAll(“\\+”, “%20”);

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据