JSP對URL鏈接中的中文亂碼處理方法總結(jié)
IE缺省對URL后面的參數(shù)是不編碼發(fā)送的,但是Tomat缺省是按ISO8859-1來進(jìn)行URL編碼的,因此才會(huì)出錯(cuò)。
方法一:
對URL鏈接進(jìn)行二次編碼:
<a onclick="javascript:window.open(encodeURI(encodeURI('./DispatchAction.do?efFormEname=FKRY0001&code_type=中文參數(shù)')))">測試</a>
或者單獨(dú)對參數(shù)進(jìn)行二次編碼:
var code_type = "中文參數(shù)"; code_type = encodeURI(code_type); code_type = encodeURI(code_type); window.open("./DispatchAction.do?efFormEname=FKRY0001&code_type="+code_type); Service: String code_type = request.getParameter("code_type"); //這句話一定要寫,因?yàn)槿绻粚懙脑捑幋a就是%E5%A6%88% code_type = java.net.URLDecoder.decode(code_type,"UTF-8");
有人提出為什么要在客戶端對字符串重復(fù)編碼兩次呢?
如果因?yàn)轫?xiàng)目需要,不能指定容器使用何種編碼規(guī)則來解碼提交的參數(shù),比如:需要接收來自不同頁面,不地編碼的參數(shù)內(nèi)容時(shí)。 (又或者是開發(fā)人員被這有點(diǎn)復(fù)雜的東西搞得暈頭轉(zhuǎn)向,不懂得如何正確的去做好這接收參數(shù)的工作)
這個(gè)時(shí)候,在客戶端對參數(shù)進(jìn)行二次編碼,可以有效的避開“提交多字節(jié)字符”的這個(gè)棘手問題。
因?yàn)榈谝淮尉幋a,你的參數(shù)內(nèi)容便不帶有多字節(jié)字符了,成了純粹的 Ascii 字符串。(這里把編第一次的結(jié)果叫成 [STR_ENC1] 好了。[STR_ENC1] 是不帶有多字節(jié)字符的)
再編一次后,提交,接收時(shí)容器自動(dòng)解一次(容器自動(dòng)解的這一次,不管是按 GBK 還是 UTF-8 還是 ISO-8859-1 都好,都能夠正確的得到 [STR_ENC1])
然后,再在程序中實(shí)現(xiàn)一次 decodeURIComponent (Java中通常使用 java.net.URLDecoder.decode(***, "UTF-8"))就可以得到想提交的參數(shù)的原值。
簡單來說,就是Tomcat服務(wù)器會(huì)自動(dòng)幫你做一次URLDecode,再加上你自己在Service代碼里面寫的URLDecode,一共就是兩個(gè)Decode了。既然要兩次Decode,當(dāng)然就需要兩次Encode了?;蛟S你會(huì)問,干脆只Encode一次,然后在java代碼里不Decode,呵呵,這個(gè)也是不行的,這其實(shí)也就是為什么要進(jìn)行兩次Encode的原因吧。
方法二:(經(jīng)測試不支持IE8)
http://xxx.do?ptname=中文參數(shù) String strPtname = request.getParameter("ptname"); strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");
方法三:
<%@ page contentType="text/html;charset=gb2312" %> <a href="ds.jsp?url=<%=java.net.URLEncoder.encode("編碼的是這里","GB2312")%>">點(diǎn)擊這里</a> <% //request.setCharacterEncoding("GBK"); if(request.getParameter("url")!=null) { str=request.getParameter("url"); str=java.net.URLDecoder.decode(str,"GB2312"); str=new String(str.getBytes("ISO-8859-1")); out.print(str); } %>
方法四:
Tomcat中設(shè)置server.xml中的Connector熟悉URIEncoding="UTF-8",確保解碼格式與編碼格式統(tǒng)一。
相關(guān)文章
Spring獲取ApplicationContext對象工具類的實(shí)現(xiàn)方法
這篇文章主要介紹了 Spring獲取ApplicationContext對象工具類的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10jsp實(shí)現(xiàn)上一頁下一頁翻頁功能(示例代碼)
下面小編就為大家?guī)硪黄猨sp實(shí)現(xiàn)上一頁下一頁翻頁功能(示例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07jsp Unsupported encoding: gb2312 錯(cuò)誤原因
今天做了一個(gè)JSP頁面,運(yùn)行時(shí)tomcat提示:org.apache.jasper.JasperException: Unsupported encoding: gb2312 錯(cuò)誤,找了很久才找到出錯(cuò)的地方,原來是一個(gè)空格惹的禍。2009-06-06jsp實(shí)現(xiàn)簡單用戶7天內(nèi)免登錄
這篇文章主要為大家詳細(xì)介紹了jsp實(shí)現(xiàn)簡單用戶7天內(nèi)免登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02JDBCTM 指南:入門6-PreparedStatement
JDBCTM 指南:入門6-PreparedStatement...2006-10-10jsp登錄注冊完整實(shí)現(xiàn)代碼(增刪改查+網(wǎng)頁+數(shù)據(jù)庫)
這篇文章主要給大家介紹了關(guān)于jsp登錄注冊完整實(shí)現(xiàn)代碼的相關(guān)資料,其中包括增刪改查+網(wǎng)頁+數(shù)據(jù)庫,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用jsp具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01JSP + ajax實(shí)現(xiàn)輸入框自動(dòng)補(bǔ)全功能 實(shí)例代碼
給別人說ajax技術(shù)時(shí),如果覺得說不明白總會(huì)這樣解釋:看到百度首頁了嗎?你打上一個(gè)字,輸入框下面會(huì)出來相關(guān)的一些選項(xiàng),那就是ajax技術(shù)。其實(shí)web上所有的異步更新技術(shù)都是通過ajax技術(shù)實(shí)現(xiàn)的。2013-06-06