Tomcat get 中文亂碼

亂碼問題

緣由:

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

 

解決方案一:

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

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

1.前臺使用urlencode,在後臺相應的使用urldecode。tomcat

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

 

解決方案二:

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

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

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

這行的意思也就是使用8080端口來接收html的請求。在這裏能夠加幾個參數來配置不一樣的效果。spa

 

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

 

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"),"頁面指定編碼")轉換

相關文章
相關標籤/搜索