超鏈接傳遞中文出現亂碼問題


今天在用超鏈接傳值時,遇到了傳遞中文到Action中出現亂碼的問題。經過在網上查找,找到了原因和一些解決辦法:

一、出現問題的原因:超連接傳遞值的基本方法是get方法  tomcat提供的默認編碼方式-默認編碼 :ISO-8859-1),在 tomcat4 中 get 與 post 的編碼是一樣的,所以只要在過濾器中通過 request.setCharacterEncoding 設定一次就可以解決 get 與 post 的問題。然而,在 tomcat5 中,get 與 post 的卻進行了不同的處理,對於post方法,采用了和tomcat4的編碼處理方法,通過request.setCharacterEncoding進行編碼處理,而get方法將通過URI提交處理,tomcat會查找server.xml文件中Connector 元素中的參數URIEncoding的值進行對URI進行encoding,如果沒有這個值,將用iso8859-1進行encoding,這樣所產生了一個無法同時解決post和get的提交編碼。這樣一來就說明產生問題的原因並不是encoding的問題,而是tomcat處理的問題。

二、解決的辦法:

1、修改tomcat的server.xml的配置文件,使其支持中文,在Connector標簽下加入URIEncoding="GBK"(或“UTF-8”)

1 <Connector port="8080" maxHttpHeaderSize="8192"  
2   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
3   enableLookups="false" redirectPort="8443" acceptCount="100"  
4   connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />

2、在Action或目的頁面中接收參數的值時,指定編碼方式

1 try {  
2      name = new String(name.getBytes("ISO-8859-1"), "utf-8");  
3 } catch(Exception e) {  
4      e.printStackTrace();  
5 }  

但是使用這種方式,會有一種問題,那就是當一個頁面既有用表單提交的內容(如:name1),也有用超鏈接提交這個內容(name1)時,在接收界面就要判斷到底是用那種方式提交過來的,如果是前者(post),則不需要用上面的指定編碼方式的方法來接收,若果用了,反而會亂碼。如果是后者(get),則必須使用上面指定編碼方式的方法來接收。這樣一來,還需要在跳轉的url中多加一個標志位來判斷到底是用哪種方式提交過來的。不是很方便。

 

3、超鏈接提交轉化為表單的post提交(這是網上別人的blog里寫的,我就直接拷貝過來了)

 1 function linkClick(linkObject) {  
 2               
 3     var formObject = document.createElement('form');  
 4     document.body.appendChild(formObject);  
 5      formObject.setAttribute('method', 'post');  
 6      var url = linkObject.href;  
 7      var uri = '';  
 8      var i = url.indexOf('?');  
 9               
10      if(i == -1) {  
11         formObject.action = url;  
12      } else {  
13         formObject.action = url.substring(0, i);  
14      }  
15               
16      if( i >= 0 && url.length >= i + 1) {  
17         uri = url.substring(i + 1, url.length);  
18      }  
19   
20      var sa = uri.split('&');  
21               
22      for(var i = 0; i < sa.length; i++) {  
23        var isa = sa[i].split('=');        
24        var inputObject = document.createElement('input');  
25        inputObject.setAttribute('type', 'hidden');  
26        inputObject.setAttribute('name', isa[0]);  
27        inputObject.setAttribute('value', isa[1]);  
28        formObject.appendChild(inputObject);  
29      }  
30               
31      formObject.submit();  
32               
33      return false;  
34 }  
1 <a href='./servlet/MyServlet?name=世界&id=1' onclick="return linkClick(this)">click me</a> <br>

使用這種方式,就把超鏈接的跳轉方式轉變成為了表單的提交方式,統一為了post方法,那么在目的界面或Action類中接收此參數時,直接接收就行了,不必進行多余的操作。

4、看到還有一種說是在傳遞中文前,先用java.net.URLEecoder.encode(value),進行編碼,在接收時再用java.net.URLDecoder.decode(value) 通過這個語句進行解碼,不過我沒有弄成功(js代碼中URLEecoder.encode(value)沒有通過),希望用這種方法成功的人,能告訴我是什么原因,怎么弄。

 

三、附上我查資料是所看的幾篇帖子地址

http://www.iteye.com/topic49/1879

http://blog.csdn.net/rodjohnsondoctor/article/details/6989273
http://xuxiaolei.iteye.com/blog/187024

 

 

 


免責聲明!

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



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