http://blog.csdn.net/yiyuhanmeng/article/details/7548505
開發一直用firfox網頁,調試什么的都很方便。所以遇到了瀏覽器之間的兼容問題。url中文傳參。
問題:前台用url傳值中文,后台用request.getParameter接收參數。
用firfox,chrome等沒有問題。用ie會出現接參亂碼現象。
上網查了一下,算了,還是把原文帖上來吧。比較容易懂。
讓jsp正確解釋含有中文的URL以及傳遞中文參數是一個很有用的特性,也是比較復雜的。我去年的一個小項目中就碰到了在URL中傳遞中文參數的問題,但是當時由於對Jsp還不是很熟悉,所以沒有解決這個問題因而舍棄了一部分功能。
但是,這個問題確實得解決,因為在即將展開的一個項目中肯定得用它。於是,今天花了一天的時間來研究這個問題,好在功夫不負有心人,現在問題終於解決了。下面就做一下介紹:
IE、Firefox、Opera三種瀏覽器對URL的傳輸的處理各不相同,瀏覽器在傳輸URl時得對URL進行編碼,IE默認是以UTF-8來傳輸的,Opera可能也是以UTF-8編碼的,Firefox經過測試肯定不是以UTF-8來編碼的,有可能是以ISO-8859-1來編碼的。所以如果不對中文進行處理,那么中文字符經各個瀏覽器以自己的編碼方式傳輸到服務器后就出現了各種編碼方式,而服務器卻只能以一種編碼方式來對接收到的URL進行解碼。這樣的話,和服務器使用的編碼方式一樣的瀏覽器在使用帶中文的URl時不會出現問題,其他的瀏覽器則會出現問題。
所以解決的辦法就是在URL進行傳輸之前對其中的中文進行編碼,使用的編碼是和服務器一樣的編碼,假設服務器使用的編碼是UTF-8,則編碼語句如下:URLEncoder.encode("中文","UTF-8")。這樣對中文進行編碼后所有的瀏覽器都不會再用他們默認的編碼方式對中文進行編碼,因為此時瀏覽器看到的已經不是中文了,而是編碼后的字節碼。這樣就避開了瀏覽器傳輸URL時編碼的差異性問題。
對中文參數問題的解決方式和上面一樣。但這里所指的中文參數是指以?name="中文參數"方式附在URL后,以get方法傳輸到服務器的這種形式,並不是以表單形式提交到服務器的。各瀏覽器對中文參數的處理方式和各自對URL中中文的處理方式都不相同,各瀏覽器之間也有差異,有的在傳輸之前不進行編碼,有的在傳輸之前就已經進行了編碼,情形非常復雜。
但是我們以不變應萬變,都用URLEncoder.encode("中文","UTF-8")對中文參數進行編碼,這樣不管各瀏覽器怎樣對中文參數進行處理,此時經過我們編碼后的中文對瀏覽器來說就是字節碼,與a、b、c等字母沒有什么區別。但是服務器會用UTF-8編碼形式來還原中文參數。
總結一下:以Tomcat服務器為例,在中添加URIEncoding="UTF-8",設置tomcat以utf-8的編碼方式來處理URL。其次,對URL中的中文和中文參數都用URLEncoder.encode("中文","UTF-8")進行編碼。
再有,就是在后台進行轉碼。
點擊后打開新頁面,用戶登錄!用戶名為中文時,火狐、google瀏覽器無問題,但IE有亂碼問題:
問題代碼:
超鏈接形式的傳參,都是Get方式!
- public String sysLogin(){
- try{
- name=new String(name.getBytes("iso-8859-1"),"utf-8");
- int r = this.memberManager.loginbysys(name);
- if(r==1){
- return "syslogin";
- }
- this.msgs.add("登錄失敗");
- }catch(RuntimeException e){
- this.msgs.add(e.getMessage());
- } catch (UnsupportedEncodingException e) {
- this.msgs.add(e.getMessage());
- }
- return this.MESSAGE;
- }
修改成功:
- <a href="javascript:toSysLogin('${member.uname }');" />登錄</a>
- function toSysLogin(name){
- var uriname="member!sysLogin.do?name="+name;
- window.open( encodeURI(uriname));
- }
- public String sysLogin(){
- try{
- this.setName(java.net.URLDecoder.decode(name, "UTF-8"));// 此處轉碼
- name=new String(name.getBytes("iso-8859-1"),"utf-8");
- int r = this.memberManager.loginbysys(name);
- if(r==1){
- return "syslogin";
- }
- this.msgs.add("登錄失敗");
- }catch(RuntimeException e){
- this.msgs.add(e.getMessage());
- } catch (UnsupportedEncodingException e) {
- this.msgs.add(e.getMessage());
- }
- return this.MESSAGE;
- }
問題解決!
encode編碼
decode解碼
這里有個全的。。
JAVA 中URL鏈接中文參數亂碼的若干處理方法,現在整理收錄如下:
方法一:
http://xxx.do?ptname='我是中國人'
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")%>">點擊這里</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);
}
%>
==================================
public String chinatoString(String str)
{
String s=str;
try
{
byte tempB[]=s.getBytes("ISO-8859-1");
s=new String(tempB);
return s;
}
catch(Exception e)
{
return s;
}
}
====================================================
function URLencode(sStr)
{
return escape(sStr).
replace(/\+/g, '%2B').
replace(/\"/g,'%22').
replace(/\'/g, '%27').
replace(/\//g,'%2F');
}
方法三:
如果用jstl的話,可以自己寫一個el的function,調用URLEncoder.encode來編碼。
IE缺省對URL后面的參數是不編碼發送的,但是tomat缺省是按ISO8859-1來進行URL解碼,因此才會出現上述錯誤。好的做法是:
1、在URL參數中確保用UTF-8編碼之,方法可以用js函數encodeURI(),或調用自定義的el function;
2、設置server.xml中的Connector熟悉URIEncoding="UTF-8",確保解碼格式與編碼格式統一;
方法四:
<script>
for(var i=0;i<document.links.length;i++){
document.links[i].href=encodeURI(document.links[i].href);
}
</script>
在action中,String s=request.getParameter("s");
s=new String(s.getBytes("iso-8859-1"),"gbk");
以上方法是收聚了一些網友所講的解決方法 。

