頁面傳值地址爛亂碼問題
位址列中出現漢字的情況有兩種,一種是漢字出現在URL的路徑部分,一種是漢字出現在URL的傳參的部分,第二種情況的時候必須採用編碼後傳參,接受時解碼的方式完成傳參。js中編碼有escape(),encodeURI(),encodeURIComponent()三個常用的方法,escape()常常用在提交頁面和處理頁面的編碼格式相同的情況下(比如它們都是GB2312),encodeURI()和encodeURIComponent()的用法基本相同,區別在於encodeURIComponent()也對"?"等特殊字元進行編碼。
一開始遇到中文引數的時候,使用encodeURI()進行了一遍編碼,傳過去後,發現解碼出現問題,於是想到可能是編碼方法使用錯誤,於是使用escape()方法,這時發現解碼時丟擲isHexDigit異常。藉助百度搜尋isHexDigit異常,
發現原來,是escape()方法造成了異常,同時瞭解了瀏覽器傳遞地址的一些原理,在瀏覽器位址列裡,瀏覽器認為%是個轉義字元,瀏覽器會把%與%之間的編碼,兩位兩位取出後進行解碼,然後再傳遞給處理頁面,
然後由處理頁面進行再次解碼。由此我想到一直使用encodeURI方法是正確的,只是需要使用兩次encodeURI方法,例如encodeURI(encodeURI("中文"));第一次是把中文編碼成%xy的格式,
第二次是對%xy中的%進行編碼,%編碼成%25。整個傳參過程大體應該是:提交頁面使用encodeURI(encodeURI("中文"))編碼,把最後的編碼結果%25xy傳遞給處理頁面的過程中,瀏覽器獲取URL地址
(注意openModelDialog方法,瀏覽器獲取不到引數編碼)後解碼成%xy,然後把%xy傳遞給處理頁面,處理頁面使用URLDecoder.decode(request.getParameter("引數名"),"UTF-8");完成解碼。
總結:
1、漢字出現在URL路徑部分的時候不需要編碼解碼;
2、使用encodeURI進行2次編碼;
3、在openModelDialog()開啟的模式窗體裡沒辦法用request.getParameter正確獲取引數;
客戶端和伺服器在傳遞資料時可以用過濾器filter解決字元編碼問題,但filter只能解決post方式提交的資料。對於get方式,可以使用兩次encodeURI(encodeURI(“中文”))並在伺服器中使用URLDecoder.decode(“中文”, "UTF-8");
今天用Ajax校驗資料時也遇到這個問題,儘管頁面、類和web容器都統一了字元編碼,提交的資料依然是亂碼,所以就採用了2次encodeURI()編碼方式,亂碼問題就解決了。
頁面
/exportExcel.topinfo?ls="+encodeURI(encodeURI(_tmplsgx))+"&zt="+encodeURI(encodeURI(_tmpzt))s
action中
String ls=request.getParameter("ls");
ls = new String(ls.getBytes("iso-8859-1"),"utf-8");
ls = java.net.URLDecoder.decode(ls,"UTF-8");這樣亂碼就解決了。
一開始遇到中文引數的時候,使用encodeURI()進行了一遍編碼,傳過去後,發現解碼出現問題,於是想到可能是編碼方法使用錯誤,於是使用escape()方法,這時發現解碼時丟擲isHexDigit異常。藉助百度搜尋isHexDigit異常,
發現原來,是escape()方法造成了異常,同時瞭解了瀏覽器傳遞地址的一些原理,在瀏覽器位址列裡,瀏覽器認為%是個轉義字元,瀏覽器會把%與%之間的編碼,兩位兩位取出後進行解碼,然後再傳遞給處理頁面,
然後由處理頁面進行再次解碼。由此我想到一直使用encodeURI方法是正確的,只是需要使用兩次encodeURI方法,例如encodeURI(encodeURI("中文"));第一次是把中文編碼成%xy的格式,
第二次是對%xy中的%進行編碼,%編碼成%25。整個傳參過程大體應該是:提交頁面使用encodeURI(encodeURI("中文"))編碼,把最後的編碼結果%25xy傳遞給處理頁面的過程中,瀏覽器獲取URL地址
(注意openModelDialog方法,瀏覽器獲取不到引數編碼)後解碼成%xy,然後把%xy傳遞給處理頁面,處理頁面使用URLDecoder.decode(request.getParameter("引數名"),"UTF-8");完成解碼。
總結:
1、漢字出現在URL路徑部分的時候不需要編碼解碼;
2、使用encodeURI進行2次編碼;
3、在openModelDialog()開啟的模式窗體裡沒辦法用request.getParameter正確獲取引數;
客戶端和伺服器在傳遞資料時可以用過濾器filter解決字元編碼問題,但filter只能解決post方式提交的資料。對於get方式,可以使用兩次encodeURI(encodeURI(“中文”))並在伺服器中使用URLDecoder.decode(“中文”, "UTF-8");
今天用Ajax校驗資料時也遇到這個問題,儘管頁面、類和web容器都統一了字元編碼,提交的資料依然是亂碼,所以就採用了2次encodeURI()編碼方式,亂碼問題就解決了。
頁面
/exportExcel.topinfo?ls="+encodeURI(encodeURI(_tmplsgx))+"&zt="+encodeURI(encodeURI(_tmpzt))s
action中
String ls=request.getParameter("ls");
ls = new String(ls.getBytes("iso-8859-1"),"utf-8");
ls = java.net.URLDecoder.decode(ls,"UTF-8");這樣亂碼就解決了。
相關文章
- jsp頁面通過url向後臺傳值時的中文亂碼問題JS
- jsp頁面中中文亂碼問題JS
- JSP頁面裡中文的亂碼問題JS
- tomcat-windows環境頁面亂碼問題TomcatWindows
- python中傳值和傳地址問題Python
- Cookie值中文亂碼問題Cookie
- 表單傳值出現亂碼問題解決方案
- JBOSS下的JSP頁面字符集亂碼問題JS
- jsp頁面傳中文到資料庫亂碼JS資料庫
- Zabbix頁面圖形內中文有亂碼問題處理(Zabbix 3.0.9)
- java抓取網頁的亂碼問題(通用)Java網頁
- URL地址中的中文亂碼問題的解決
- JavaWeb開發之頁面傳值JavaWeb
- asp.net 頁面傳值方法ASP.NET
- JSP頁面間傳值方法JS
- 後臺向vue頁面傳值Vue
- 郵件傳送時的亂碼問題
- SQL Server 值亂碼問題 (多國語言)SQLServer
- ASP.NET頁面傳值基本方式ASP.NET
- Asp.Net頁面傳值的方法ASP.NET
- IOS學習筆記(頁面傳值:屬性傳值,協議代理傳值,閉包傳值)iOS筆記協議
- springboot下的純html頁面亂碼帶問號?Spring BootHTML
- 七道最經典的asp.net頁面傳值題ASP.NET
- PbootCMS後臺頁面顯示亂碼boot
- 關於JSP用include插入頁面出現亂碼問題,請教各位高手JS
- 靜態頁面之間傳值簡單程式碼例項
- flex亂碼問題Flex
- mysql亂碼問題MySql
- js解決url傳引數中文亂碼問題JS
- Flutter11 路由、頁面傳值、NavigatorFlutter路由
- Flutter多個頁面廣播通知傳值Flutter
- [MUI] mui框架實現頁面間傳值UI框架
- iOS——使用StroryBoard頁面跳轉及傳值iOS
- ASP.NET頁面間傳值彙總ASP.NET
- IIS設定404頁面返回200碼和404頁面亂碼解決方法
- 用XMLHTTP Post/Get HTML頁面時的中文亂碼問題之完全Script解決方案 (轉)XMLHTTPHTML
- tomcat8.5+ windows中html頁面及控制檯中文亂碼問題解決辦法TomcatWindowsHTML
- Struts2 URL 傳參,中文亂碼問題解決