我對JavaWeb中中文URL編碼的簡單總結


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM