我对JavaWeb中中文URL编码的简单总结

标签: Java  JSP  编码

1、application/x-www-form-urlencoded

它是一种编码类型。当URL地址里包含非西欧字符的字符串时,系统会将这些字符转换成application/x-www-form-urlencoded字符串。表单里提交时也是如此,当包含非西欧字符的字符串时,系统也会将这些字符转换成application/x-www-form-urlencoded字符串,然后在服务器端自动解码。FORM元素的enctype属性指定了表单数据向服务器提交时所采用的编码类型,默认的缺省值是“application/x-www-form-urlencoded。

Java类中提供了URLEncoderURLDecoder操作URL转换。

在这里插入图片描述
在这里插入图片描述

2、不同的浏览器默认对含中文的URL转化采用的编码不同

参考大佬文章:
https://blog.csdn.net/u014785687/article/details/74078512

正因如此,所以才会使用Java提供的那两个URL编码类来统一编码。

3、某些Web容器自动解码问题

参考大佬文章
https://blog.csdn.net/vickyway/article/details/46375971?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/qq_27886773/article/details/95078589?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

某些web容器在request.getParameter()自动解码,比如Tomcat就这么干。
Tomcat自动解码默认以其默认的编码解码。

Tomcat不同版本的默认编码格式
Tomcat7:ISO-8859-1
Tomcat8:UTF-8

重点来了:正因为Tomcat存在自动解码一次的问题,所以,在前端JSP页面编码中文URL时,为了防止后端获取乱码,所以采用二次编码的方式。

UTF-8编码(第一次编码)->UTF-8或iso-8859-1(第二次编码,这里看Tomcat默认哪种编码自动解码)编码->Tomcat使用默认编码自动解码(第一次解码)->手动UTF-8解码(第二次解码)

编码和解码的过程是对称的,所以不会出现乱码。

实际使用

前端

...
 <div class="show_box">
    <%-- 二次编码,我的中文URL处理编码:gbk  Tomcat默认解码编码:utf-8--%>
    <img src="<%=request.getContextPath()%>/image/translate.do?key=<%=URLEncoder.encode(URLEncoder.encode(file.getFileName(),"gbk"),"utf-8")%>"/>
    <%-- 二次编码,我的中文URL处理编码:gbk  Tomcat默认解码编码:utf-8--%>
    <p><a href="<%=request.getContextPath()%>/image/translate.do?key=<%=URLEncoder.encode(URLEncoder.encode(file.getFileName(),"gbk"),"utf-8")%>&download=1"><input type="button" class="btn btn-primary" value="下载"/></a><a href="<%=request.getContextPath()%>/"><input type="button" class="btn" value="返回"/></a></p>
</div>
...

后端

...
		//设置请求编码--仅针对Post请求
        //request.setCharacterEncoding("utf-8");
        //获取文件名--并通过前端二次编码,后端二次解码 解决中文名问题
        String downloadSign=request.getParameter("download");
        //采用两次编码并且两次解码
        //Tomcat在getParameter时已经自动解码一次,下面我手动解码
        String key=URLDecoder.decode(request.getParameter("key"),"gbk");
        //测试
        System.out.println("我的名字:"+key);
...

参考大佬:
https://blog.csdn.net/shabijiayong/article/details/79094438?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://www.cnblogs.com/Wahitler/p/4761373.html
https://www.cnblogs.com/yuanfy008/p/6937803.html

版权声明:本文为weixin_43670802原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43670802/article/details/105233269