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類中提供了URLEncoder
與URLDecoder
操作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