Tomcat get 中文亂碼


亂碼問題

原因:

tomcat默認的在url傳輸時是用iso8859-1編碼。

 

解決方案一:

在使用get傳輸參數時,將參數中的中文轉換成url格式,也就是使用urlEncode和urlDecode來傳輸,使用這種方式就是把中文轉換成以%開頭的編碼在url中傳輸。

使用這種方法時,要注意兩點。

1.前台使用urlencode,在后台相應的使用urldecode。

2.使用urlencode的內容是參數內空。千萬要注意,他是會把等於號等符號也給轉換了。所以,最好是先把參數傳換后再進行拼接。而不是把url拼接好再去轉換。

 

解決方案二:

配置tomcat,使用其在url傳輸過程中使用相應的支持中文的編碼。一般國內的喜歡用gbk或gb2312。我個人建議使用utf-8

在tomcat的/conf/server.xml文件中,找到以下這一行。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

這行的意思也就是使用8080端口來接收html的請求。在這里可以加幾個參數來配置不同的效果。

 

URIEncoding="UTF-8" 設置url傳輸時對url內容的編碼格式

 

compression="on" 打開壓縮功能 

compressionMinSize="2048" 啟用壓縮的輸出內容大小,這里面默認為2KB

noCompressionUserAgents="gozilla, traviata" 對於以下的瀏覽器,不啟用壓縮 

compressableMimeType="text/html,text/xml" 壓縮類型

 

對於要解決亂碼來說,改成以下就行

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

 

轉:

經過分析,使我對TOMCAT的處理機制和HttpServletRequest有了更加深入的認識。

1.filter過濾器中獲取參數值出現亂碼

下面是服務器端中的過濾器獲取參數的代碼:

Java代碼   收藏代碼
  1. public void doFilter(ServletRequest arg0, ServletResponse arg1,  
  2.         FilterChain arg2) throws IOException, ServletException {  
  3.     String foo=arg0.getParameter("foo");  
  4.     System.out.println(foo);  
  5.     arg2.doFilter(arg0, arg1);  
  6. }  

 

 

    當我在瀏覽器輸入“http//:localhost:8080/rest/test?foo=中國”時,瀏覽器會自動對"中國"進行URI轉碼,由於使 用的中文語言環境,瀏覽器會將“中國”轉碼為"%D6%D0%B9%FA"."D6D0","B9FA"分別"中","國"的GBK編碼。等價於在 JAVA語言中作了如下操作

Java代碼   收藏代碼
  1. URLEncoder.encode("中國","GBK")  

 

傳遞到服務器后的URL實際為“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。

    由於TOMCAT默認會對URL進行解碼,並且使用的是ISO-8859-1字符集,如下所示

Java代碼   收藏代碼
  1. URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");  

 因為編碼和解碼使用的是不同的字符集,所以解碼出來的字符串肯定是不對的,故而使用如下方式獲取參數值時出現亂碼。

Java代碼   收藏代碼
  1. String foo=request.getParameter("foo");  

 2.resteasy的service方法中獲取參數出現亂碼

Java代碼   收藏代碼
  1. @GET  
  2. @Path("/test")  
  3. public void hello10(@QueryParam(value="foo") String foo) {  
  4.     System.out.println(foo);  
  5.   
  6. }     

 resteasy中獲取到request參數foo的機制與前面的filter略有不同。foo參數的是值由resteasy框架進行類似如下處理后獲得的。

 

Java代碼   收藏代碼
  1. String params=request.getQueryString();  
  2. System.out.println(params);//foo=%D6%D0%B9%FA  
  3. String encodedParams= URLDecoder.decode(params,"UTF-8");  
  4. ......  

 通過getQueryString()方式獲得的參數並沒有被TOMCAT解碼過,但被resteasy框架進行了解碼,當傳入參數不是以UTF-8編碼的話獲取到的參數就可能是亂碼

3.總結

使用request.getParameter方式獲得的參數是已經經過web服務器解碼的

使用request.getQueryString可以獲得未解碼的原始參數

對於tomcat解碼造成的亂碼問題可以通過2種途徑解決

         修改tomcat配置文件設置解碼方式

         服務器端對於獲取到的參數進行new String(param.getBytes("ISO-8859-1"),"頁面指定編碼")轉換


免責聲明!

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



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