GET请求参数中文乱码的解决办法
POST请求参数中文乱码,一般使用编码拦截器就可以解决,但是GET请求是地址栏传参,这些配置就没办法解决了。而java项目一般部署在tomcat上,第一种方式就是修改tomcat的配置文件,达到中文乱码的问题,如下:
<!-- 修改前 --> <Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- 修改后 --> <Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UFT-8" />
这种方式对于本地测试,或者部署拥有shell权限的服务器,是比较简单的,但是遇到购买web空间的站点,修改起来就没有那么容易啦,当然,你也可以选择tomcat 8及其以上的服务器空间;这些服务器默认解码方式是UTF-8。 即使是这样,有时候,我们也不想用户直接看到用户地址栏中存在一大串的中文,这样体验也不好。如果你有这样的需求,那么下面这种这样将是一个比较好的实现方式:
js请求数据前做编码处理
<script> // 这里要看清,两次encodeURI(),第一次将字符串转换为十六进制,第二次,修改转移符号(%) window.location.href = localhost:8080/dev/main?name + encodeURI(encodeURI("小明")); </script>
java后台接收参数处理
// 接收参数 String name = request.getParameter("name"); // 将接收到的参数做decode转换,还原(%)的转移字符,并以UTF-8进行解码字符串 name = URLDecoder.decode(name, "UTF-8");
如果我们有很多种种问参数这样传参,是不是很麻烦呢;如果你使用了springMVC,那么你可以注册一个自定义参数解析器,解析参数的时候,直接进行URI转换,并赋值。
这样是解决后端接收的问题了,但是前端呢?如果你使用可ajax的工具,例如axios等一些工具,也可以在请求拦截器中,重新对请求的参数进行编码
总结
URLDecoder和URIencode是比较简单的解决方式,但是真正做到项目时,我们未必能想得到,因为我们使用大量的框架,最直接的解决方式一般会去想框架有没有解决。
encodeURI和decodeURI
encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码. UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.
假设我们传参为“中国”,这解码方式如下 1.第一次encodeURI,按照utf-8方式获取数组[-28, -72, -83, -27, -101, -67],其中前三个为“中”,后三个为“国”;遍历数组,将数组转化为16进制[E4, B8, AD, E5, 9B, BD],最后添加上百分号[%E4, %B8, %AD, %E5, %9B, %BD],现在已经分解为单字节符。
2.第二次encodeURI,进行编码,这是会处理%号这个转义字符。不处理%以外的字符,他会把%编码为%25,这样数组就变成了最终的[%25E4, %25B8, %25AD, %25E5, %259B, %25BD],然后提交服务器。
3.服务器调用getParameter拿到请求参数为[%25E4, %25B8, %25AD, %25E5, %259B, %25BD],服务器会使用URLDecode进行处理;第一次处理不管是按照UTF-8,还是GBK,还是ISO-8859的格式编码的,都会得到[%E4, %B8, %AD, %E5, %9B, %BD],因为这一次只对%进行去转移符;然后再使用UTF-8解码一次,就得到我们的中文字符了。